class base { }; class derived { }; template<class T> void foo() {} int main() { foo<int>(); foo<derived>(); }
Я хочу специализироваться foo для Т = деривация base. Это возможно или мне нужно специализироваться на base самой?
foo
base
Вы можете комбинировать boost :: enable_if и boost :: is_base_of, как описано в руководстве для boost :: enable_if .
template <class T> T foo(typename enable_if<boost::is_base_of<base,T> >::type* dummy = 0);
Один из вариантов - использовать черты типа повышения (или, если вы чувствуете себя храбрым, посмотрите на источник этой библиотеки).
Во время компиляции вы можете определить, наследуется ли типдругой тип и поэтому выберите подходящую реализацию.