2016-10-01 36 views
16

有没有确保模板参数是枚举类类型的方法?确保模板参数是一个枚举类

我知道type_traitsstd::is_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类'定义一个隐式运算符? –

+0

是的,我的不好,你实际上不能在'enum class'中定义运算符或函数。 –