Вы можете использовать черты типа и SFINAE
template<typename T,
bool[std::is_base_of<T_base, T>::value] = nullptr>
void f(T const&);
версия C ++ 03, которая также работает для C ++ 11
template<typename T>
typename boost::enable_if< boost::is_base_of<T_base, T> >::type
f(T const&);
Существует версия C ++ 11перемещая enable_if
в список параметров шаблона, используя аргумент по умолчанию
template<typename T,
typename = typename std::enable_if<
std::is_base_of<T_base, T>::value>::type>
void f(T const&);
К сожалению, вы не сможете перегрузить f
, если единственное отличие вашей другой перегрузки - строка SFINAE (т.е. аргумент по умолчанию)потому что аргумент по умолчанию не является частью сигнатуры шаблона функции.Но тип параметров шаблона сам по себе (эти правила аналогичны нормальным параметрам функции).