Строка для enums в C ++

Есть ли способ связать строку из текстового файла с значением enums?

Проблема в том, что у меня есть несколько значений enums, которые хранятся в виде строки в текстовом файле, который я прочитал «на лету» при выполнении некоторых условий … Теперь я хочу присвоить значение чтения перечислению.

Каков наиболее эффективный способ сделать это? Это не должно быть самым простым подходом.

Вы можете настроить карту, которую вы можете использовать снова и снова:

template  class EnumParser { map  enumMap; public: EnumParser(){}; T ParseSomeEnum(const string &value) { map ::const_iterator iValue = enumMap.find(value); if (iValue == enumMap.end()) throw runtime_error(""); return iValue->second; } }; enum SomeEnum { Value1, Value2 }; EnumParser::EnumParser() { enumMap["Value1"] = Value1; enumMap["Value2"] = Value2; } enum OtherEnum { Value3, Value4 }; EnumParser::EnumParser() { enumMap["Value3"] = Value3; enumMap["Value4"] = Value4; } int main() { EnumParser parser; cout << parser.ParseSomeEnum("Value2"); } 
 std::map< string, enumType> enumResolver; 

Я согласен со многими ответами, что std::map – это самое простое решение.

Если вам нужно что-то быстрее, вы можете использовать hash-карту. Возможно, ваш компилятор уже предлагает один, например hash_map или предстоящий стандартный unordered_map, или вы можете получить его от boost . Когда все строки известны заранее, может быть использовано идеальное хеширование .

Посмотрите на Boost.Bimap , он обеспечивает двунаправленные ассоциации между двумя наборами значений. Вы также можете выбрать базовый контейнер.

Использование std::map вызывает вопрос: как инициализируется карта? Я бы предпочел использовать функцию:

 enum E { A, B }; E f( const std::string & s ) { if ( s == "A" ) { return A; } else if ( s == "B" ) { return B; } else { throw "Your exception here"; } } 

Это то, что вы хотите? Инициализация является прямой, и никакой инстанцирования не требуется.

Применение:

 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); ... } 

библиотека:

 template  struct CStringPair { const char* _name; T _value; }; template  struct CStringPairHandle { typedef CStringPair CPair; static const CStringPair * getPairList(){ return Derived::implementation(); } static T findValue(const char* name){ const CStringPair * 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 * 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{ \ static CPair _pairList[]; \ static CPair* implementation(){ \ return _pairList; \ }}; #define INIT_PAIRLIST(name) name::CPair name::_pairList[] 

Соберите строку самостоятельно, сопоставьте строку со значением (которое также является индексом к map .

Принятый ответ не содержит полного листинга. Я добавляю EnumParser.h который я создал из принятого ответа, надеюсь, что он может помочь

 #include  #include  using namespace std; template  class EnumParser { map enumMap; public: EnumParser(){}; T ParseSomeEnum(const string &value) { typename map ::const_iterator iValue = enumMap.find(value); if (iValue == enumMap.end()) throw runtime_error(""); return iValue->second; } }; 

Использование прост:

 enum FieldType { Char, Integer, Long, Fixed, Price, Date, Time }; EnumParser::EnumParser() { enumMap["Char"] = Char; enumMap["Integer"] = Integer; enumMap["Long"] = Long; enumMap["Fixed"] = Fixed; enumMap["Price"] = Price; enumMap["Date"] = Date; enumMap["Time"] = Time; } 

использовать:

  EnumParser fieldTypeParser; FieldType val = fieldTypeParser.ParseSomeEnum(stringValue) 

Вы можете рассчитать hash строки, а затем использовать это:

 template  E map_hash(H const key, std::initializer_list> const il) { auto const i( std::find_if(il.begin(), il.end(), [key](auto& p) { return p.first == key; } ) ); assert(i != il.end()); return i->second; } 
  • Алгоритм поиска нескольких совпадений строк
  • Как работает расширение параметра Bash?
  • Команда не обнаружила ошибку в присвоении переменной Bash
  • Как разбить строку, разделенную запятой?
  • Как проверить, существует ли строка в файле с Bash?
  • Изменение строковых констант?
  • Добавить значения в строку запроса
  • Форматировать строки в методе Console.WriteLine
  • Формат метода (String, Object ) в типе String не применим для аргументов (...)
  • как преобразовать строку в дату в mysql?
  • Строка макроопределения
  • Interesting Posts

    Такая же функция с const и без – когда и почему?

    Изменение значения столбца «Рейтинг» в проводнике для произвольных типов файлов

    Как удалить все обратные вызовы из обработчика?

    Как удалить фокус, не устанавливая фокус на другой элемент управления?

    Передача файлов по сеансу SSH через два хоста

    Что такое банковский конфликт? (Выполнение программирования Cuda / OpenCL)

    Удаление имени входа из списка автозаполнения?

    Параметры индекса поиска Windows не отображают типы файлов

    Можно ли перебирать документы, хранящиеся в индексе Lucene?

    Как включить один частичный в другой, не создавая новую область?

    Запуск сценария Windows 8 при запуске

    Как отключить службу индексирования поиска Windows при работе от аккумулятора в Windows 7?

    Как настроить пользовательский заголовок в запросе Volley

    Как объединить два поля в текстовом описании SelectList?

    Есть ли способ изменить коды статуса http, возвращаемые шлюзом API Amazon?

    Давайте будем гением компьютера.