C++ 是否可以确定类型是否为作用域枚举类型?

C++ 是否可以确定类型是否为作用域枚举类型?,c++,enums,c++11,metaprogramming,typetraits,C++,Enums,C++11,Metaprogramming,Typetraits,是否存在类型特征,或者是否可以编写一个类型特征Is\u scoped\u enum,以便: 如果T是作用域枚举,是作用域枚举::value是true和 如果T是任何其他类型,是作用域的\u enum::value是false 我认为测试它是否是一个枚举,并且是否不能隐式转换为底层类型应该可以做到这一点 template <typename T, bool B = std::is_enum<T>::value> struct is_scoped_enum : std::f

是否存在类型特征,或者是否可以编写一个类型特征
Is\u scoped\u enum
,以便:

  • 如果
    T
    是作用域枚举,
    是作用域枚举::value
    true
  • 如果
    T
    是任何其他类型,
    是作用域的\u enum::value
    是false

我认为测试它是否是一个枚举,并且是否不能隐式转换为底层类型应该可以做到这一点

template <typename T, bool B = std::is_enum<T>::value>
struct is_scoped_enum : std::false_type {};

template <typename T>
struct is_scoped_enum<T, true>
: std::integral_constant<bool,
    !std::is_convertible<T, typename std::underlying_type<T>::type>::value> {};
模板
结构是_作用域_枚举:std::false _类型{};
模板
结构是\u作用域\u枚举
:std::积分_常数{};

所谓作用域枚举,是指C++11的枚举吗?@Nawaz:作用域枚举就是C++11中调用的
enum类,是的。只是出于好奇,对于这个类型有什么实际应用?@Xeo:我正在重载一组作用域枚举类型的按位运算符。最好使用
std::undernative_type
而不是
int
。C++11中的
enum类
可以基于不能转换为
int
@KennyTM的内容:什么类型?C++11§7.2/2规定“枚举基应命名一个整数类型”;是否有整数类型不能转换为
int
?@JamesMcNellis:你说得对。抱歉搞混了。(我想
是可转换的
做隐式转换。)这是一个很好的解决方案,除了在最新的编辑中,逻辑现在是向后的:
::如果
T
是非范围枚举,则值
为真。:-)@Excelcius这比是否出现错误更糟糕:使用非枚举类型的
std::underground_type
是未定义的行为,不需要诊断,因此编译器无需报告误用情况,这会导致程序错误。我没有研究常见的实现,但假设该标准允许UB在有效的用例中简化实现。