2012-05-24 14 views
5

Sto provando a creare una semplice funzione di ricerca bidirezionale per enumerare in C++. Ho un senso di ricerca lavorando bene ...boost :: bimap per enum

enum MyEnum 
{ 
    One, 
    Two, 
    Three 
}; 

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

e poi facendo uno sguardo attraverso

MyEnumMap.at(One) 

che funziona, ma consente solo per le ricerche basate su chiave. Mi piacerebbe utilizzare un contenitore di ricerca bidirezionale come boost: bimap per consentire facili ricerche inverse basate sul valore e sulla chiave. Non sembra che map_list_of sia compatibile con boost :: bimap.

In primo luogo, dovrei ancora utilizzare map_list_of con boost :: bimap, o è richiesto un altro tipo?
Le mappe saranno tutte di tipo base (Enum, stringa).

In secondo luogo, c'è un modo in cui posso ancora definire la mappa come const in un modo semplice come sopra? Sto cercando di rendere questo più facile da aggiornare e mantenere il più possibile senza entrare in troppi typedef aggiuntivi e simili. La tua intuizione è apprezzata.

+0

se si è solo interessati a un buon sistema per mappare gli enumeratori alle stringhe, è possibile utilizzare boost_enum (dal deposito di potenziamento). Guarda questo thread: http://stackoverflow.com/questions/217549/which-typesafe-enum-in-c-are-you-using –

risposta

12

Prova utilizzando LIST_OF direttamente:

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 l'utilizzo di 'relazione' invece di 'value_type'.

+0

Questo funziona bene, grazie! – salimoneus