Я встречал эту ситуацию так много раз...
enum Fruit {
Apple,
Banana,
Pear,
Tomato
};
Теперь у меня есть Fruit f; // banana
, и я хочу перейти от f
к строке "Banana"
; или у меня есть string s = "Banana"
, и я хочу перейти к Banana // enum value or int
.
До сих пор я это делал. Предполагая, что перечисление находится в Fruit.h:
// Fruit.cpp
const char *Fruits[] = {
"Apple",
"Banana",
"Pear",
"Tomato",
NULL
};
Очевидно, что это грязное решение. Если разработчик добавляет новый фрукт в заголовок и не добавляет новую запись в Fruits [] (не может винить его, они должны быть в двух разных файлах!) Приложение идет стрелой.
Есть ли простой способ делать то, что я хочу, где все находится в одном файле? Препроцессорные хаки, чужая магия, все, что угодно.
PS: Это, вопреки отражению "для всего", было бы действительно тривиально реализовать в компиляторах. Видя, насколько распространена проблема (по крайней мере для меня), я действительно не могу поверить, что нет reflective enum Fruit
.. Даже в С++ 0x.
PS2: Я использую С++, но я отметил этот вопрос как C, потому что C имеет ту же проблему. Если ваше решение включает в себя только С++, это нормально для меня.