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
是false是作用域的\u enum::value
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在有效的用例中简化实现。