質問

列挙型のテンプレート化されたメソッドを特殊化することは可能ですか?

次のようなもの(以下の無効なコード):

template <typename T>
void f(T value);

template <>
void f<enum T>(T value);

それが不可能な場合、intunsigned intlong longunsigned long longなどの多くのタイプの特殊化があり、列挙値が使用する特殊化があると仮定します

役に立ちましたか?

解決

std::enable_if std::is_enum <type_traits>からこれを達成します。

回答私の質問の1つに、litbはBoostの同等物でこれをどのように行うことができるかについての非常に非常に詳細でよく書かれた説明を投稿しました。

他のヒント

質問を正しく理解しているかどうかはわかりませんが、特定の列挙型でテンプレートをインスタンス化できます:

template <typename T>
void f(T value);

enum cars { ford, volvo, saab, subaru, toyota };
enum colors { red, black, green, blue };

template <>
void f<cars>(cars) { }

template <>
void f<colors>(colors) { }

int main() {
    f(ford);
    f(red);
}

おそらく、あなたがそれについてあなたが知っている唯一のことである型であなたがすることができる唯一の興味深いことは、それが列挙型であり、それをその基礎となる型にキャストし、その上で動作することです。 Jamesが提案したアプローチ(別名 SFINAE )を使用すると、次のようになります。 :

void Bar(int b); // and/or other underlying types

template<typename T>
typename std::enable_if<std::is_enum<T>::value, void>::type
Foo(T enm)
{
    Bar(static_cast<typename std::underlying_type<T>::type>(enm));
}

関連するボーナスとして、選択した特定のタイプに対してのみ解決される同様の方法を次に示します(is_sameのブールを選択したタイプに置き換えます):

template<typename T>
typename std::enable_if<std::is_same<T,bool>::value, void>::type
Baz(T bl)
{
    if (bl)
    {
        //...
    }
    else
    {
        //...
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top