2012-05-24 14 views
5

Ich versuche, eine einfache bidirektionale Suchfunktion für Enums in C++ zu erstellen. Ich habe one-way-Lookup feine Arbeit ...boost :: bimap für enum

enum MyEnum 
{ 
    One, 
    Two, 
    Three 
}; 

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

und dann einen Blick über

MyEnumMap.at(One) 

tun, das funktioniert, aber es erlaubt nur auf die wichtigsten Basis-Lookups. Ich würde gerne einen bidirektionalen Lookup-Container wie boost: bimap verwenden, um einfache Reverse-Lookups auf der Basis von Werten und Schlüsseln zu ermöglichen. Es scheint nicht so, dass map_list_of mit boost :: bimap kompatibel ist.

Erstens, sollte ich noch map_list_of mit boost :: bimap verwenden, oder ist ein anderer Typ erforderlich?
Die Karten sind alle Basisdaten (Enum, String).

Zweitens, gibt es eine Möglichkeit, die Karte als const auf einfache Weise wie oben zu definieren? Ich versuche, dies so einfach wie möglich zu machen und zu warten, ohne zu viele zusätzliche Typedefs und so weiter zu bekommen. Ihre Einsicht wird geschätzt. mit LIST_OF

+0

Wenn Sie nur an einer guten Möglichkeit interessiert sind, Enumeratoren auf Strings abzubilden, können Sie boost_enum (aus dem Boost Vault) nutzen. Schau dir diesen Thread an: http://stackoverflow.com/questions/217549/which-typesafe-enum-in-c-are-you-using –

Antwort

12

Versuchen Sie direkt:

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"); 

Hinweis die Verwendung von 'Beziehung' statt 'value_type'.

+0

Das funktioniert gut, danke! – salimoneus