2012-05-24 2 views
5

Я пытаюсь создать простой двунаправленный механизм поиска для перечислений на C++. У меня есть один-путь поиска работает отлично ...boost :: bimap для enum

enum MyEnum 
{ 
    One, 
    Two, 
    Three 
}; 

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

, а затем делает вид через

MyEnumMap.at(One) 

Это работает, но он позволяет только на основе поисков ключа. Я бы хотел использовать двунаправленный контейнер поиска, например boost: bimap, чтобы упростить обратный поиск на основе значения, а также ключа. Кажется, что map_list_of совместим с boost :: bimap.

Во-первых, должен ли я использовать map_list_of с boost :: bimap или требуется другой тип?
Все карты будут базовыми (Enum, string).

Во-вторых, есть ли способ, которым я могу определить карту как const простым способом, как указано выше? Я пытаюсь сделать это так легко обновлять и поддерживать, насколько это возможно, не вдаваясь в слишком много дополнительных typedef и т. Д. Ваше понимание очень ценится.

+0

Если вы просто заинтересованы в том, чтобы перечислить нумераторы в строки, вы можете воспользоваться boost_enum (из хранилища boost). Посмотрите эту тему: http://stackoverflow.com/questions/217549/which-typesafe-enum-in-c-are-you-using –

ответ

12

Попробуйте использовать 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"); 

Обратите внимание на использование 'отношения' вместо 'value_type'.

+0

Это работает красиво, спасибо! – salimoneus