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

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

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

Ответы [ 2 ]

9 голосов
/ 19 марта 2019

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

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

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

1 голос
/ 19 марта 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...