#include <iostream>
struct a {
enum LOCAL_A { A1, A2 };
};
enum class b { B1, B2 };
int foo(int input) { return input; }
int main(void) {
std::cout << foo(a::A1) << std::endl;
std::cout << foo(static_cast<int>(b::B2)) << std::endl;
}
Esto a::LOCAL_A
es lo que la enumeración fuertemente tipada está tratando de lograr, pero hay una pequeña diferencia: las enumeraciones normales se pueden convertir en un tipo entero, mientras que las enumeraciones fuertemente tipadas no pueden hacerlo sin una conversión.
Entonces, ¿hay alguna manera de convertir un valor de enumeración fuertemente tipado en un tipo entero sin conversión? Si es así, ¿cómo?
fuente
Como han dicho otros, no puede tener una conversión implícita, y eso es por diseño.
Si lo desea, puede evitar la necesidad de especificar el tipo subyacente en el reparto.
fuente
Una versión C ++ 14 de la respuesta proporcionada por R. Martinho Fernandes sería:
Al igual que con la respuesta anterior, esto funcionará con cualquier tipo de enumeración y tipo subyacente. He agregado la
noexcept
palabra clave ya que nunca arrojará una excepción.Actualización
Esto también aparece en Effective Modern C ++ de Scott Meyers . Vea el ítem 10 (se detalla en las páginas finales del ítem dentro de mi copia del libro).
fuente
fuente
No. No hay forma natural .
De hecho, una de las motivaciones detrás de haber escrito fuertemente
enum class
en C ++ 11 es evitar su conversión silenciosa aint
.fuente
La razón de la ausencia de conversión implícita (por diseño) se dio en otras respuestas.
Yo personalmente uso unary
operator+
para la conversión de clases enum a su tipo subyacente:Lo que da bastante poca "sobrecarga de escritura":
Donde realmente uso una macro para crear enumeraciones y el operador funciona de una sola vez.
fuente
Espero que esto te ayude a ti oa alguien más
fuente
un.i
ese es el "miembro activo" y solo puede leer el miembro activo de una unión.static_cast
.La respuesta corta es que no puedes, como señalan las publicaciones anteriores. Pero para mi caso, simplemente no quería saturar el espacio de nombres, pero aún tenía conversiones implícitas, así que simplemente lo hice:
El tipo de espacio de nombres agrega una capa de seguridad de tipo mientras que no tengo que convertir estáticamente ningún valor de enumeración al tipo subyacente.
fuente
Foo::Foo
. Se puede acceder a los miembros comoFoo::bar
yFoo::baz
se puede emitir implícitamente (y por lo tanto, no hay mucha seguridad de tipo). Probablemente sea mejor usar casi siempre clases de enumeración, especialmente si comienza un nuevo proyecto.Esto parece imposible con el nativo
enum class
, pero probablemente puedas burlarte de unenum class
con unclass
:En este caso,
sería equivalente a:
Esto es principalmente equivalente al original
enum class
. Puede regresar directamenteb::B1
en una función con tipo de retornob
. Puedes hacerswitch case
con eso, etc.Y en el espíritu de este ejemplo, puede usar plantillas (posiblemente junto con otras cosas) para generalizar y burlarse de cualquier objeto posible definido por la
enum class
sintaxis.fuente
Como muchos dijeron, no hay forma de convertir automáticamente sin agregar gastos generales y demasiada complejidad, pero puede reducir un poco su escritura y hacer que se vea mejor usando lambdas si algún elenco se usará demasiado en un escenario. Eso agregaría un poco de función de llamada general, pero hará que el código sea más legible en comparación con las largas cadenas static_cast como se puede ver a continuación. Esto puede no ser útil para todo el proyecto, sino solo para toda la clase.
fuente
El comité de C ++ dio un paso adelante (delimitando las enumeraciones del espacio de nombres global) y cincuenta pasos hacia atrás (sin disminución del tipo de enumeración a entero). Lamentablemente,
enum class
simplemente no es utilizable si necesita el valor de la enumeración de alguna manera no simbólica.La mejor solución es no usarlo en absoluto y, en su lugar, examinar la enumeración usted mismo utilizando un espacio de nombres o una estructura. Para este propósito, son intercambiables. Tendrá que escribir un poco más cuando se refiera al tipo de enumeración en sí, pero eso probablemente no sea frecuente.
fuente