与えられた:
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;
}
しかし、これは不可能であるように思われるので(C ++ 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()
では、whatとは呼ばれず、実際にはかなりの作業を行います。実際には、ではなく、ユーザー定義の型に「特化」したいと思いますfloat
。