2008-11-26 51 views
7

Me preguntaba en C++ si tengo una enumeración ¿puedo acceder al valor en el segundo índice? Por ejemplo tengoEnum C++ Obtener por índice

enum Test{hi, bye}; 

si quiero 'hola', puedo hacer algo como Test [0], gracias.

+0

No. Pero si le das un caso de uso, puede haber buenas alternativas. –

Respuesta

1

Las enumeraciones asignan los nombres a los valores. En su caso, (int) hi tendría un valor de 0, y (int) bye un valor de 1. Se puede usar un yeso para obtener el valor de hi:

int myInteger = 0; 
Test myValue = (Test)myInteger; 

Tenga en cuenta, sin embargo, que myValue podría ser un valor de enum inválido si myInteger está fuera del rango.

0

No, pero podría lanzar de int

Test test = (Test)0; 
+0

Esta es una muy mala idea, ya que no se garantiza que esos valores sean índices adecuados. –

0

Su mejor opción podría ser algo como esto:

enum Test{hi = 0, bye}; 

, entonces solo puede referirse a 'hola' con el número 0, y 'Adiós' con 1.

Aunque esto realmente frustra el propósito de utilizar una enumeración en primer lugar.

17

Sí y no. Si su Enum no tiene valores explícitos, entonces es posible. Sin un valor explícito, a los valores enum se les asignan valores numéricos 0-N en orden de declaración. Por ejemplo ...

enum Test { 
    hi, // 0 
    bye // 1 
} 

Esto significa que los índices solo se traduce en un valor literal.

Test EnumOfIndex(int i) { return static_cast<Test>(i); } 

Por supuesto, esto 0 validación en tiempo de ejecución y tan pronto como se agrega un valor explícito se descompone. Pero funcionará en el escenario predeterminado.

5

A menos que se especifique lo contrario, las enumeraciones comienzan la numeración en 0 y aumentan en 1 cada entrada.

enum Test 
{ 
    hi, //0 
    bye, //1 
    count //2 
} 

Puede convertir un int con el tipo de la enumeración para obtener el valor que desee, como por ejemplo:

(Test)0; 
//or 
Test(0); 

que le permiten hacer cosas como:

for(int i = 0; i < count; i++) 
{ 
    DoSomething((Test)i); 
} 
+6

Utilice static_cast (i) en lugar de (Prueba) i – jab

1

Depends lo que quieres decir con "quiero 'hola'".

Si quiere decir que quiere el valor, puede obtenerlo lanzando un int, como han dicho otros.

La conversión de un literal numérico a tipo enum no suele tener sentido; si sabe qué valor está esperando, puede usar el nombre. De esa manera, la enumeración puede cambiar sin romper su código. Supongo que es posible que algo realmente extraño esté sucediendo, donde alguien haya creado una enumeración, y haya documentado qué significa "3", pero no qué valor enum es. Pero luego querrías arreglar la API.

Lanzar un valor entero conocido en el tiempo de ejecución a enum podría ser útil si tiene datos serializados. Siempre que sepa que está dentro del alcance de la enumeración, se define el resultado.

Si quiere decir que quiere la cadena "hola", entonces no puede tenerla. A diferencia de Java, en C++ los nombres de los valores en los tipos enumerados existen solo en tiempo de compilación, no en tiempo de ejecución, y solo se asignan en una dirección.

0

Si está exceptuando el valor devuelto como {Hola o Adiós}, entonces no puede obtener el valor de esa manera.

No me sugiere que esto se haga finde para obtener el valor real, sino que se puede utilizar como hackear

string return_value(int index) 
{ 
string temp = ""; 
switch (index) 
{ 
case 1: temp = "hi" 
break; 
case 2: temp = "bye"; 
break; 
defualt : 
break; 
} 
return temp; 
} 

encasillamiento de enumeración sería más volver el índice pero se puede asignar a alguna otra variable de enumeración