Использовать обратные вызовы карты к элементу
В идеале было бы лучше сопоставить меню элемента с его соответствующими действиями.std::map<std::string, std::function<void()>>
позволяет именно это!Прочитайте встроенные комментарии, чтобы понять смысл остальных:
#include <string>
#include <map>
#include <iostream>
#include <functional>
int main()
{
std::map<std::string, std::function<void()>> menu_items;
menu_items.emplace("calc", [](){std::cout << "calculate chosen\n";}); //use lambdas to spare boilerplate
menu_items.emplace("game", [](){std::cout << "game is chosen\n";});
std::string chosen_item;
std::cin >> chosen_item;
auto item = menu_items.find(chosen_item); //search by the string
if (item == menu_items.end()) //item was not found in the list
std::cout << "invalid item is chosen\n";
else
item->second(); //execute the stored function
}
Демо .
В зависимости от вашего использования вы можете использовать void*()
для std::function<void()>
и std::unordered_map
для std::map
.Для вашего случая использования это, похоже, не имеет значения.
Также вы можете захотеть нормализовать ввод, например, в нижнем регистре или выполнить другую нормализацию.Поскольку это не чувствительная к производительности часть кода, я считаю, что издержки std::function
и std::map
в этом случае не будут иметь значения.