J'ai un tas de types enum dans une bibliothèque fichiers d'en-tête que j'utilise, et je veux avoir un moyen de convertir les valeurs de l'enum à l'utilisateur cordes, et vice-versa.
RTTI de ne pas le faire pour moi, parce que l '" utilisateur cordes besoin d'être un peu plus lisible que les énumérations.
Une attaque par force brute solution serait un tas de fonctions de ce genre, mais j'ai l'impression que c'est un peu trop C-like.
enum MyEnum {VAL1, VAL2,VAL3};
String getStringFromEnum(MyEnum e)
{
switch e
{
case VAL1: return "Value 1";
case VAL2: return "Value 2";
case VAL1: return "Value 3";
default: throw Exception("Bad MyEnum");
}
}
J'ai le pressentiment qu'il y a une solution élégante à l'aide de modèles, mais je n'arrive pas à obtenir ma tête autour de lui encore.
Mise à JOUR: Merci pour les suggestions - j'aurais dû préciser que les enums sont définies dans une bibliothèque tierce, en-tête, donc je ne veux pas avoir à modifier la définition d'entre eux.
Mon sentiment profond est maintenant pour éviter de modèles et de faire quelque chose comme ceci:
char * MyGetValue(int v, char *tmp); // implementation is trivial
#define ENUM_MAP(type, strings) char * getStringValue(const type &T) \
{ \
return MyGetValue((int)T, strings); \
}
; enum eee {AA,BB,CC}; - exists in library header file
; enum fff {DD,GG,HH};
ENUM_MAP(eee,"AA|BB|CC")
ENUM_MAP(fff,"DD|GG|HH")
// To use...
eee e;
fff f;
std::cout<< getStringValue(e);
std::cout<< getStringValue(f);