Очень распространенным методом является использование указателей на функции или boost :: function, индексируемых по имени элемента или имеющих вектор из них и индексируемых по индексу элемента для этого задания. Простой пример с использованием имени элемента:
void exit_me(); /* exits the program */
void help(); /* displays help */
std::map< std::string, boost::function<void()> > menu;
menu["exit"] = &exit_me;
menu["help"] = &help;
std::string choice;
for(;;) {
std::cout << "Please choose: \n";
std::map<std::string, boost::function<void()> >::iterator it = menu.begin();
while(it != menu.end()) {
std::cout << (it++)->first << std::endl;
}
std::cin >> choice;
if(menu.find(choice) == menu.end()) {
/* item isn't found */
continue; /* next round */
}
menu[choice](); /* executes the function */
}
В C ++ пока нет лямбда-функции, поэтому вам, к сожалению, действительно нужно использовать функции для этой задачи. Вы можете использовать boost :: lambda, но имейте в виду, что он просто имитирует лямбды и далеко не так мощен, как собственное решение:
menu["help"] = cout << constant("This is my little program, you can use it really nicely");
Обратите внимание на использование константы (...), так как иначе boost :: lambda не заметит, что это должно быть лямбда-выражение: компилятор попытается вывести строку, используя std :: cout, и назначит результат (ссылка std :: ostream) на menu ["help"]. Вы все еще можете использовать boost :: function, так как он будет принимать все, возвращающее void и не принимая никаких аргументов, включая объекты-функции, которые и создает boost :: lambda.
Если вам действительно не нужны отдельные функции или boost :: lambda, вы можете просто распечатать вектор имен элементов, а затем switch
на номере элемента, заданном пользователем. Это, вероятно, самый простой и прямой способ сделать это.