2012-07-12 36 views
129

Duplicar posible:
Generic way to cast int to enum in C++Cómo convertir int a enum en C++?

¿Cómo lanzar un int a un enum en C++?

Por ejemplo:

enum Test 
{ 
    A, B 
}; 

int a = 1; 

¿Cómo convierto a al tipo de prueba :: A?

+84

me gusta el hecho de que esto no tiene puntuación negativa, marcado como duplicado, pero es los primeros resultados al hacer una búsqueda en Google de "C++ int to enum" – Rickard

+1

[link] (http://www.enel.ucalgary.ca/People/Norman/enel315_winter1997/enum_types/) Nota que no importa si el int coincide con una de las constantes del tipo enum; la conversión de tipo es siempre ilegal. – Iwaz

+6

Si esto es un dup, ¿por qué las respuestas son tan diferentes? – nobar

Respuesta

152
int i = 1; 
Test val = static_cast<Test>(i); 
+11

auto val = static_cast (i); // C++ 11 – Mitch

+1

@Mitch ¿Qué obtengo por usar 'auto' en este caso? ¿Hay alguna mejora en el rendimiento? –

+1

Sin mejoras de rendimiento. Solo mejoras de mantenimiento – Mitch

50
Test e = static_cast<Test>(1); 
+0

MSDN: no se realiza ninguna comprobación de tipo de tiempo de ejecución para garantizar la seguridad de la conversión (http://msdn.microsoft.com/en-us/library/c36yw7x9(v=vs.80).aspx). –

+6

MSDN: el operador static_cast puede convertir explícitamente un valor integral a un tipo de enumeración. Si el valor del tipo integral no cae dentro del rango de valores de enumeración, el valor de enumeración resultante no está definido. –

+1

@KirillKobelev si el valor integral se puede representar por el tipo subyacente de la enumeración, entonces la enumeración resultante debe tener ese valor. De lo contrario, el valor enum producido será cualquier valor resultante de la conversión de la expresión al tipo subyacente de la enumeración. Si VC++ hace algo diferente, entonces creo que es no conforme. – bames53

13

Su código

enum Test 
{ 
    A, B 
} 

int a = 1; 

Solución

Test castEnum = (Test)a; 
+34

Es una buena idea usar el reparto más restrictivo que puedas, y evitar los moldes de estilo C por completo, para darle al compilador la mejor oportunidad de detectar errores.'static_cast' sería un mejor elenco aquí. –

+3

@Mike Seymour, el problema es que el lanzamiento estático no tiene ninguna diferencia con el C-cast en este caso. ¿Cómo y qué error puede detectar? –

+7

@KirillKobelev: El problema es que un molde de estilo C no es explícito. Puede ser igual a un 'static_cast', pero podría ser un' const_cast' o peor, un 'reinterpret_cast' o incluso una combinación de esos. Incluso si sabes ahora en qué se degradará, supongo que cambias 'a' a otro tipo más adelante, bien podría ser el tipo de cambios de conversión sin que recibas siquiera una advertencia, no quieres eso. – KillianDS