Возможно ли сохранение какого-либо типа функции в одной переменной?

Я пытаюсь создать массив меню, в котором каждый элемент является структурой, в которой хранятся переменные для текста, клавиша, которую нужно нажать, чтобы выбрать этот элемент, и функция, вызываемая при нажатии этой клавиши (что-то вроде "Выход", "Q", Выход()). Я думал, что это сделает вещи более эффективными, но я не могу найти способ заставить его работать с различными типами функций и параметров (например, один элемент должен иметь возможность вызывать функцию void без параметров, другой - функцию класса int с два параметра и тд). Есть ли хороший способ сделать это, или мне лучше отказаться от этой идеи?

Изменение: Спасибо всем за ваш совет! Предложенные решения кажутся мне слишком сложными для моего новичка, но попытка понять их дала мне некоторые идеи! В итоге я заставил третью переменную хранить перечисление вместо прямого вызова функции, а затем создал функцию-переключатель, которая вызывает другие функции на основе этого значения.

Ответы

Ответ 1

Есть несколько способов сделать это.

Одним из способов является использование std::bind для привязки всех функций к void func(void) тогда вы можете хранить их одинаково.
Другой способ - создать обобщенную функцию/лямбду, которая будет вызывать вашу функцию.
Для хранения ваших функций вы можете использовать std::function.

Также рассмотрите возможность переопределения operator() ваших классов.

Ответ 2

Классический способ справиться с этим состоит в том, чтобы все функции принимали одинаковые параметры, и чтобы они были очень гибкими. Например, целое число или перечисление и указатель.

  • ваша функция без параметров передается -1 и nullptr и игнорирует их
  • Ваша многопараметрическая функция преобразует указатель в указатель на некоторую структуру или класс, который содержит все необходимые биты и кусочки (и, конечно, ваш вызывающий код создал этот экземпляр и передал его адрес)

Причина, по которой перечисление или целое число выводится как один из параметров, заключается в том, что "тип команды" является очень популярной вещью, которая нужна, так зачем все это приводить и извлекать для ее получения?

Если у вас есть проблемы с производительностью в результате этого подхода, то есть и другие, но они буквально десятилетиями использовались в Windows.