Допустим, у меня есть несколько таких блоков:
// Ввод символа
do switch (_getch()) {
// Делать одно
case '1': dosmth1();
break;
// Делать второе
case '2': dosmth2();
break;
// Делать третье
case '3': dosmth3();
break;
// Выйти
case '0': dosmth0();
return 0;
} while (true);
Но, ввиду частого создания оных, возникает вопрос:
Как организовать такую функцию menu(), которая создавала бы n-ное количество case, соответствующих n-ному количеству параметров (указателей на функции)?
Вызов такой функции по принципу stdarg
menu(4, dosmth1, dosmth2, dosmth3, dosmth0);
Ответ
Если сигнатуры вызываемых функций одинаковы, то самый простой способ - использовать контейнер типа std::map, std::unordered_map. Ключом будет выступать char или int, а в качестве типа значения использоваться указатель на функцию. Например:
std::map
Когда контейнер заполнен использование может быть сокращено до вида:
action[_getch()]();
Понятно, что в общем случае могут потребоваться дополнительные проверки на существование элемента, т.к. по умолчанию оператор [] приводит к созданию элемента, если его не было.
Комментариев нет:
Отправить комментарий