Возможно ли сохранение какого-либо типа функции в одной переменной?
Я пытаюсь создать массив меню, в котором каждый элемент является структурой, в которой хранятся переменные для текста, клавиша, которую нужно нажать, чтобы выбрать этот элемент, и функция, вызываемая при нажатии этой клавиши (что-то вроде "Выход", "Q", Выход()). Я думал, что это сделает вещи более эффективными, но я не могу найти способ заставить его работать с различными типами функций и параметров (например, один элемент должен иметь возможность вызывать функцию void без параметров, другой - функцию класса int с два параметра и тд). Есть ли хороший способ сделать это, или мне лучше отказаться от этой идеи?
Изменение: Спасибо всем за ваш совет! Предложенные решения кажутся мне слишком сложными для моего новичка, но попытка понять их дала мне некоторые идеи! В итоге я заставил третью переменную хранить перечисление вместо прямого вызова функции, а затем создал функцию-переключатель, которая вызывает другие функции на основе этого значения.
Ответы
Ответ 1
Есть несколько способов сделать это.
Одним из способов является использование std::bind
для привязки всех функций к void func(void)
тогда вы можете хранить их одинаково.
Другой способ - создать обобщенную функцию/лямбду, которая будет вызывать вашу функцию.
Для хранения ваших функций вы можете использовать std::function
.
Также рассмотрите возможность переопределения operator()
ваших классов.
Ответ 2
Классический способ справиться с этим состоит в том, чтобы все функции принимали одинаковые параметры, и чтобы они были очень гибкими. Например, целое число или перечисление и указатель.
- ваша функция без параметров передается -1 и
nullptr
и игнорирует их - Ваша многопараметрическая функция преобразует указатель в указатель на некоторую структуру или класс, который содержит все необходимые биты и кусочки (и, конечно, ваш вызывающий код создал этот экземпляр и передал его адрес)
Причина, по которой перечисление или целое число выводится как один из параметров, заключается в том, что "тип команды" является очень популярной вещью, которая нужна, так зачем все это приводить и извлекать для ее получения?
Если у вас есть проблемы с производительностью в результате этого подхода, то есть и другие, но они буквально десятилетиями использовались в Windows.