ho incontrato questa situazione così tante volte ...C/C++: un modo per ottenere enumerazioni riflessive?
enum Fruit {
Apple,
Banana,
Pear,
Tomato
};
ora ho Fruit f; // banana
e voglio andare da f
alla stringa "Banana"
; oppure ho string s = "Banana"
e da quello voglio andare a Banana // enum value or int
.
Finora ho fatto questo .. Supponendo che l'enumerazione è in Fruit.h:
// Fruit.cpp
const char *Fruits[] = {
"Apple",
"Banana",
"Pear",
"Tomato",
NULL
};
Ovviamente questa è una soluzione disordinata. Se uno sviluppatore aggiunge un nuovo frutto all'intestazione e non aggiunge una nuova voce in Fruits [] (non si può biasimarlo, devono essere in due file diversi!) L'applicazione va a gonfie vele.
C'è un modo semplice per fare ciò che voglio, dove tutto è in un unico file? Hack preprocessore, magia aliena, qualsiasi cosa ..
PS: Questo, contrariamente alla riflessione "per tutto", sarebbe davvero banale da implementare nei compilatori. Vedendo quanto sia un problema comune (almeno per me) non riesco davvero a credere che non ci sia il reflective enum Fruit
.. Neanche in C++ 0x.
PS2: Sto usando C++ ma ho taggato questa domanda come C, perché C ha lo stesso problema. Se la tua soluzione include solo cose C++, va bene per me.
Questo aspetto è molto simile a: http://stackoverflow.com/questions/147267/easy-way-to-use-variables-of-enum-types-as-string-in-c/ –
@Jonathan: sì , anche se questo richiede una mappatura bidirezionale. E string-to-int è più difficile rispetto ai mapping int-to-string. – MSalters
@ Mark: Scusa la mia ignoranza, ma cosa, biologicamente, è un pomodoro se non è un frutto nel tuo libro? – DevSolar