2011-06-08 26 views
42

Duplicar posible:
Is there a simple script to convert C++ enum to string?Enumeración de cadena C++

que comúnmente se encuentran Necesito convertir una enumeración a una cadena en C++

siempre termino haciendo:

enum Enum{ Banana, Orange, Apple } ; 

char * getTextForEnum(int enumVal) 
{ 
    switch(enumVal) 
    { 
    case Enum::Banana: 
    return "bananas & monkeys"; 
    case Enum::Orange: 
    return "Round and orange"; 
    case Enum::Apple: 
    return "APPLE" ; 

    default: 
    return "Not recognized.."; 
    } 
} 

¿Hay un idioma mejor o reconocido para hacer esto?

+0

Quizás usar 'std :: mapa ' en lugar de la enumeración y el interruptor ? Con un poco de envoltura en un objeto puede hacerlo lo suficientemente inteligente como para ser reutilizable como un buscador de código de error y controlador para todas sus aplicaciones. – AJG85

+3

Una mejora es omitir la cláusula 'predeterminado:' mientras se sube el nivel de advertencia en su compilador y se tratan las advertencias como errores. De esta forma, si alguna vez extiende la lista de enumeraciones, el compilador advertirá y fallará en su declaración de cambio, recordándole que amplíe el cambio también. Algunas personas dicen que siempre deberías tener un incumplimiento, pero creo que este es un escenario en el que la falta de ayuda puede ayudarte. –

Respuesta

38
enum Enum{ Banana, Orange, Apple } ; 
static const char * EnumStrings[] = { "bananas & monkeys", "Round and orange", "APPLE" }; 

const char * getTextForEnum(int enumVal) 
{ 
    return EnumStrings[enumVal]; 
} 
+17

Funciona solo para enumeraciones continuas. – SasQ

+3

@SasQ, tengo una respuesta más extensa aquí: http://stackoverflow.com/a/11586083/5987 Muchas otras buenas sugerencias en ese hilo también. –

+0

Un mejor prototipo sería 'const char * getTextForEnum (int) const;' mi amigo. Mejores prácticas. –

9

Puede arrojar el valor enum y la cadena en un mapa STL. Entonces podrías usarlo así.

return myStringMap[Enum::Apple]; 
19

Una especie de tabla de consulta anónima en lugar de una larga declaración del interruptor:

return (const char *[]) { 
    "bananas & monkeys", 
    "Round and orange", 
    "APPLE", 
}[enumVal];