Согласно этому ответу ,
SFINAE работает только в том случае, если подстановка при выводе аргумента из аргумента шаблона делает конструкцию некорректной.
Вот почему вы не можете сделать что-то подобное:
template <typename T>
struct Task
{
typename std::enable_if<std::is_base_of<FooBase, T>::value>::type doIt() {
std::cout << "Type is derived from FooBase\n";
}
typename std::enable_if<std::is_base_of<FooBase, T>::value == false>::type doIt()
{
}
};
Здесь doIt()
не шаблон, поэтому никаких вычетов.Но вы можете сделать следующее:
template <typename T1>
struct Task
{
template <typename T>
typename std::enable_if<std::is_base_of<FooBase, T>::value>::type doIt_() {
std::cout << "Type is derived from FooBase\n";
}
template <typename T>
typename std::enable_if<std::is_base_of<FooBase, T>::value == false>::type doIt_()
{
}
void doIt()
{
doIt_<T1>();
}
};