列挙型のテンプレート化されたメソッドを特殊化することは可能ですか?
(以下の無効なコード)のようなもの:
template <typename T>
void f(T value);
template <>
void f<enum T>(T value);
それが不可能な場合、私が、、、、などのいくつかのタイプの特殊化を持っていると仮定するとint
、列挙値が使用する特殊化はどれですか?unsigned int
long long
unsigned long long
列挙型のテンプレート化されたメソッドを特殊化することは可能ですか?
(以下の無効なコード)のようなもの:
template <typename T>
void f(T value);
template <>
void f<enum T>(T value);
それが不可能な場合、私が、、、、などのいくつかのタイプの特殊化を持っていると仮定するとint
、列挙値が使用する特殊化はどれですか?unsigned int
long long
unsigned long long
fromを使用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));
}
関連するボーナスとして、選択した特定のタイプに対してのみ解決される同様の方法を次に示します (bool を選択is_same
したタイプに置き換えます)。
template<typename T>
typename std::enable_if<std::is_same<T,bool>::value, void>::type
Baz(T bl)
{
if (bl)
{
//...
}
else
{
//...
}
}