Чтобы добавить вариант, используя самый простой из возможных контейнеров (нет необходимости в упорядоченной карте) ... Я бы не стал беспокоиться о enum - просто поместите определение контейнера непосредственно перед переключателем, чтобы его было легко увидеть какое число представляет какой случай.
Это выполняет хешированный поиск в unordered_map
и использует связанный int
для управления оператором switch. Должно быть довольно быстро. Обратите внимание, что at
используется вместо []
, так как я сделал этот контейнер const
. Использование []
может быть опасным - если строка отсутствует на карте, вы создадите новое отображение и можете получить неопределенные результаты или постоянно растущую карту.
Обратите внимание, что функция at()
сгенерирует исключение, если строка отсутствует на карте. Так что вы можете сначала протестировать, используя count()
.
const static std::unordered_map<std::string,int> string_to_case{
{"raj",1},
{"ben",2}
};
switch(string_to_case.at("raj")) {
case 1: // this is the "raj" case
break;
case 2: // this is the "ben" case
break;
}
Ниже приведена версия с тестом для неопределенной строки:
const static std::unordered_map<std::string,int> string_to_case{
{"raj",1},
{"ben",2}
};
switch(string_to_case.count("raj") ? string_to_case.at("raj") : 0) {
case 1: // this is the "raj" case
break;
case 2: // this is the "ben" case
break;
case 0: //this is for the undefined case
}