2012-05-23 204 views
12

有一种特质,或者是有可能写出一个类型特征is_scoped_enum<T>这样的:是否可以确定某个类型是否是范围枚举类型?

  • 如果T是一个范围的列举,is_scoped_enum<T>::valuetrue
  • 如果T是任何其他类型,is_scoped_enum<T>::value是假
+0

* scoped enum *,你的意思是C++ 11的枚举? – Nawaz

+1

@Nawaz:范围枚举是在C++ 11中调用enum类的,是的。 –

+0

出于好奇,这个有什么实际应用? – Xeo

回答

22

我想测试,如果它是一个枚举不隐式转换为基本类型应该做的伎俩。

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> {}; 
+2

更好地使用'std :: underlying_type '而不是'int'。 C++ 11中的'enum class'可以基于不可转换为'int'的东西。 – kennytm

+0

@KennyTM好点。编辑。 –

+0

@KennyTM:什么类型? C++ 11§7.2/ 2声明“_enum-base_应该命名为整型;”有没有可转换为'int'的整数类型? –

相关问题