2012-05-23 15 views
12

¿Hay un rasgo tipo, o es posible escribir un rasgo tipo is_scoped_enum<T> tal que:¿Es posible determinar si un tipo es un tipo de enumeración con ámbito?

  • si T es una enumeración restringidos, is_scoped_enum<T>::value es true y
  • si T es cualquier otro tipo, is_scoped_enum<T>::value es falsa
+0

Por * scoped enum *, ¿quiso decir C++ 11's enum? – Nawaz

+1

@Nawaz: una enumeración delimitada es lo que se llama una 'clase enum' en C++ 11, sí. –

+0

Solo por curiosidad, ¿qué aplicaciones prácticas hay para esta? – Xeo

Respuesta

22

Creo probando si se trata de una enumeración y no convertir implícitamente al tipo subyacente debe hacer el truco.

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

Mejor uso 'std :: underlying_type ' en lugar de 'int'. Una 'clase enum' en C++ 11 puede basarse en algo no convertible a' int'. – kennytm

+0

@KennyTM buen punto. Editado –

+0

@KennyTM: ¿Qué tipo? C++ 11 §7.2/2 establece "El _enum-base_ nombrará un tipo integral;" ¿hay un tipo integral no convertible a 'int'? –

Cuestiones relacionadas