¿Hay alguna forma de convertir un enum class
campo al tipo subyacente? Pensé que esto sería automático, pero aparentemente no.
enum class my_fields : unsigned { field = 1 };
unsigned a = my_fields::field;
GCC está rechazando esa asignación. error: cannot convert 'my_fields' to 'unsigned int' in assignment
.
enum
.[C++11: 7.2/9]
.Respuestas:
Creo que puede usar std :: subyacente_type para conocer el tipo subyacente y luego usar cast:
Con esto, no tiene que asumir el tipo subyacente, o no tiene que mencionarlo en la definición de
enum class
similarenum class my_fields : int { .... }
o algo así.Incluso puede escribir una función de conversión genérica que debería poder convertir cualquiera
enum class
a su tipo integral subyacente :luego úsalo:
Y dado que se declara que la función es
constexpr
, puede usarla donde se requiera una expresión constante:fuente
template <typename T> auto to_integral(T e) { return static_cast<std::underlying_type_t<T>>(e); }
constexpr
en el futuro; de hecho, uno mucho más poderoso que el que tenía en 2013: P)No puede convertirlo implícitamente , pero es posible una conversión explícita:
También tenga en cuenta el hecho de que el punto y coma debe estar después de la llave cerrada en la definición de su enumeración, no antes.
fuente
Encuentro la siguiente función
underlying_cast
útil cuando tengo que serializar valores de enumeración correctamente.fuente
Como otros han señalado, no hay una conversión implícita, pero puede usar una explícita
static_cast
. Utilizo las siguientes funciones auxiliares en mi código para convertir hacia y desde un tipo de enumeración y su clase subyacente.Código de uso
fuente