¿Esto es lo que quieres? La inicialización es recta, y no se necesita instanciación.
uso:
enum SomeEnum
{
ENUM_ONE,
ENUM_TWO,
ENUM_THREE,
ENUM_NULL
};
DEFINE_PAIRLIST(CEnumMap, SomeEnum)
INIT_PAIRLIST(CEnumMap)=
{
{"One", ENUM_ONE},
{"Two", ENUM_TWO},
{"Three", ENUM_THREE},
{"", ENUM_NULL}
};
main{
// Get enum from string
SomeEnum i = CEnumMap::findValue("One");
// Get string from enum
SomeEnum eee = ENUM_ONE;
const char* pstr = CEnumMap::findKey(eee);
...
}
biblioteca:
template <class T>
struct CStringPair
{
const char* _name;
T _value;
};
template <class T, class Derived>
struct CStringPairHandle
{
typedef CStringPair<T> CPair;
static const CStringPair<T> * getPairList(){
return Derived::implementation();
}
static T findValue(const char* name){
const CStringPair<T> * p = getPairList();
for (; p->_name[0]!=0; p++)
if (strcmp(name,p->_name)==0)
break;
return p->_value;
}
static const char* findKey(T value){
const CStringPair<T> * p = getPairList();
for (; p->_name[0]!=0; p++)
if (strcmp(value,p->_value)==0)
break;
return p->_name;
};
};
#define DEFINE_PAIRLIST(name, type) struct name:public CStringPairHandle<type, name>{ \
static CPair _pairList[]; \
static CPair* implementation(){ \
return _pairList; \
}};
#define INIT_PAIRLIST(name) name::CPair name::_pairList[]
¿Por qué no usar un hasmap? ¿Sería la búsqueda más eficiente? Bueno, debe probar y medir la efectividad, ya que puede depender del número de elementos en su enumeración ... Con gran enumeración, hasmap podría hacer que sea una forma más rápida de obtener el valor, ¿no es así? –
hash_map no es parte del estándar (y unordered_map solo se agregó en TR1). Además, es probable que haya muy poca diferencia entre hash_map y el mapa a menos que comience a tener una gran cantidad de valores enum.En cualquier caso, es un cambio fácil si los perfiles indican que algo es demasiado lento – Eclipse
el mapa hash sería muy ineficiente para la mayoría de las enumeraciones que tienen un número muy limitado de valores. De hecho, la búsqueda lineal puede ser más eficiente que un hash-map si la enumeración solo muestra los 8 valores normales. Si tiene 2 o 3, la búsqueda lineal probablemente también vencerá a std :: map. – CashCow