2012-05-24 13 views
5

Estoy tratando de crear una facilidad de búsqueda bidireccional simple para enumeraciones en C++. Tengo una sola vía de búsqueda de trabajo bien ...boost :: bimap para enum

enum MyEnum 
{ 
    One, 
    Two, 
    Three 
}; 

const boost::unordered_map<MyEnum,std::string> MyEnumMap = map_list_of 
    (One, "One") 
    (Two, "Two") 
    (Three, "Three"); 

y luego hacer una mirada a través de

MyEnumMap.at(One) 

que funciona pero sólo permite búsquedas en base a la clave. Me gustaría usar un contenedor de búsqueda bidireccional como boost: bimap para permitir búsquedas inversas fáciles basadas en el valor y la clave. Sin embargo, no parece que map_list_of sea compatible con boost :: bimap.

En primer lugar, ¿debería seguir utilizando map_list_of con boost :: bimap, o es necesario otro tipo?
Los mapas serán todos de tipo básico (Enum, cadena).

En segundo lugar, ¿hay alguna manera de que pueda definir el mapa como const de una manera sencilla como la anterior? Estoy tratando de hacer que esto sea tan fácil de actualizar y mantener como sea posible sin entrar en demasiados typedefs adicionales y tal. Su visión es apreciada.

+0

si solo está interesado en una buena forma de asignar enumeradores a cadenas, puede aprovechar boost_enum (desde la bóveda de impulso). Mira este hilo: http://stackoverflow.com/questions/217549/which-typesafe-enum-in-c-are-you-using –

Respuesta

12

Intente utilizar directamente list_of:

typedef boost::bimap< MyEnum, std::string > bm_type; 
const bm_type MyEnumMap = 
    boost::assign::list_of<bm_type::relation> 
    (One, "One") 
    (Two, "Two") 
    (Three, "Three"); 

Nota el uso de 'relación' en lugar de 'value_type'.

+0

¡Esto funciona muy bien, gracias! – salimoneus