2016-10-01 11 views
16

テンプレートパラメータがenum-class型であることを確認する方法はありますか?テンプレートパラメータがenumクラスであることを確認

私はtype_traitsstd::is_enumであることを知っていますが、通常のenumと一致するようにはしません。ちょうどenum_classesです。指名手配効果の

例:

enum class EnumClass {}; 
enum Enum {}; 
class Class {}; 

template <typename T> 
void Example() 
{ 
    static_assert(/* T is EnumClass */, "`T` must be an enum class"); 
} 

Example<EnumClass>(); // Ok 
Example<Enum>(); // Error 
Example<Class>(); // Error 

私はC++ 11を使用しています、と私はそれが新しい基準を必要とする場合でも、とにかく解決策を知りたいだろうけれども、残念ながら(任意の上位に行くことができません)。

可能ですか?

答えて

17

あなたはでそれを達成することができます:

template<typename T> 
using is_class_enum = std::integral_constant< 
    bool, 
    std::is_enum<T>::value && !std::is_convertible<T, int>::value>; 

Hereデモ。


あなたがSFINAEを使用したい場合は、同じで達成することができます:私が間違っている場合

template<typename T, typename _ = void> 
struct is_class_enum : std::false_type { 
}; 

template<typename T> 
struct is_class_enum < 
    T, 
    typename std::enable_if<std::is_enum<T>::value && 
          !std::is_convertible<T, int>::value>::type> : 
    public std::true_type { 
}; 
+0

は、私を修正していますが、単に列挙クラスは暗黙的に変換されないという事実に依存しています積分に?暗黙的な変換演算子を定義することはできませんか? –

+1

@GiladNaaman 'enum class'からどのように暗黙の演算子を定義しますか? –

+0

ええ、私の悪いことに、実際には 'enum class'の中で演算子や関数を定義することはできません。 –

関連する問題