Дано:
struct A
{
virtual bool what() = 0;
};
template<typename T, typename Q>
struct B : public A
{
virtual bool what();
};
Я хочу частично специализировать what
как:
template<typename T, typename Q>
bool B<T, Q>::what()
{
return true;
}
template<typename Q>
bool B<float, Q>::what()
{
return false;
}
Но похоже, что это невозможно (это в С++ 11?), поэтому я попробовал SFINAE:
template<typename T>
typename std::enable_if<std::is_same<T, float>::value, bool>::type B<T>::what()
{
return true;
}
template<typename T>
typename std::enable_if<!std::is_same<T, float>::value, bool>::type B<T>::what()
{
return false;
}
Это тоже не работает, я понятия не имею, почему, хотя, кто-нибудь? Итак, я нашел эту тему и в итоге:
template<typename T, typename Q>
struct B : public A
{
virtual bool what()
{
return whatimpl(std::is_same<T, float>());
}
bool whatimpl(std::false_type)
{
return false;
}
bool whatimpl(std::true_type)
{
return true;
}
};
Это окончательное решение работает, но почему технология enable_if
не работает? Я также очень открыт для предложений о более чистом ответе, который я еще не встречал.
Я максимально упростил свои примеры - в моем реальном случае использования what()
не называется тем, что и на самом деле выполняет справедливую работу, и я хочу "специализироваться" на пользовательском типе, а не float
.