que he encontrado esta situación tantas veces ...C/C++: ¿alguna forma de obtener enumeraciones reflectantes?
enum Fruit {
Apple,
Banana,
Pear,
Tomato
};
Ahora tengo Fruit f; // banana
y quiero ir de f
a la cadena "Banana"
; o tengo string s = "Banana"
y de eso quiero ir al Banana // enum value or int
.
Hasta ahora he estado haciendo esto .. Suponiendo que la enumeración está en Fruit.h:
// Fruit.cpp
const char *Fruits[] = {
"Apple",
"Banana",
"Pear",
"Tomato",
NULL
};
Obviamente eso es una solución desordenado. Si un desarrollador agrega una nueva fruta al encabezado y no agrega una nueva entrada en Fruits [] (no lo culpo, ¡tienen que estar en dos archivos diferentes!) La aplicación se dispara.
¿Hay una manera simple de hacer lo que quiero, donde todo está en un solo archivo? Preprocesador piratea, magia extraterrestre, cualquier cosa ...
PD: Esto, al contrario de la reflexión "para todo", sería realmente trivial de implementar en compiladores. Viendo lo común que es un problema (al menos para mí), realmente no puedo creer que no haya reflective enum Fruit
. Ni siquiera en C++ 0x.
PS2: Estoy usando C++ pero etiqueté esta pregunta como C porque C tiene el mismo problema. Si su solución incluye C++ solo cosas, eso está bien para mí.
Esto se ve notablemente similar a: http://stackoverflow.com/questions/147267/easy-way-to-use-variables-of-enum-types-as-string-in-c/ –
@Jonathan: yes , aunque esto requiere un mapeo bidireccional. Y string-to-int es más difícil que int-to-string mappings. – MSalters
@ Mark: Disculpe mi ignorancia, pero ¿qué, biológicamente, es un tomate si no es una fruta en su libro? – DevSolar