考える:部分特殊
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;
}
これも機能しませんが、私はなぜ誰もしませんか?だから私はthis threadを発見してしまった:
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
。
@Nawaz私はそれを認識しましたが、これは私が何をしようとしているかを示す単純なケースです:)記事の最後の行を読んでください。 – David
_what_は、A :: what()をオーバーライドするためのテンプレートメソッドではありません。クラステンプレートBの単一の非テンプレートメソッドでなければなりません。テンプレート以外のメソッドを特化することはできません。enable_ifも他のテクニックも使用できません。しかし、あなたはクラスB全体を特殊化することができます – user396672
@ user396672なぜ、これは機能しますか(部分的なものではなく完全な特殊化): 'template <> bool B :: what() { return false; } ' –
David