Я сталкивался с такой ситуацией много раз ...
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
.. Даже в C ++ 0x.
PS2: я использую C ++, но я также пометил этот вопрос как C, потому что C имеет ту же проблему. Если ваше решение включает только C ++, это нормально для меня.