Откладывание выполнения функции с помощью указателей на функции - PullRequest
0 голосов
/ 18 марта 2019

Я хочу создать переменную из класса Command, которая получит функцию и ее аргументы и выполнит ее при вызове Execute, но я не знаю, как передать аргументы конструкторов переменным члена класса, так как я могу ' Рассказать, как будет выглядеть указатель на функцию.

Вот некоторый псевдокод для того, что я имею в виду.

class Command {
public:
  template<_Fn, _Args...>
  Command(_Fn&& _function, _Args&&... _args)
  {
  }

  void Execute(){
  }
};

void Print(int _int, float _float){
  ...
}

void Print(const char* _text, unsigned int _uint){
  ...
}

int main(){
  Command cmd0 = Command(&Print, 5, 6.2f);
  Command cmd1 = Command(&Print, "Hello", 2u);
  cmd1.Execute();
  cmd0.Execute();
}

1 Ответ

4 голосов
/ 18 марта 2019

Нет необходимости заново изобретать это, просто используйте std::function и std::bind:

int main(){
  std::function<void()> cmd0 = std::bind(&PrintIntFloat, 5, 6.2f);
  std::function<void()> cmd1 = std::bind(&PrintStringInt, "Hello", 2u);
  cmd1();
  cmd0();
}

Обратите внимание, что я переименовал функции, потому что снятие наборов перегрузки проблематично в C ++.

Или вы можете использовать лямбды, в этом случае подъем не требуется (спасибо deW1 за предложение):

std::function<void()> cmd0 = [] { Print(5, 6.2f); };
std::function<void()> cmd1 = [] { Print("Hello", 2u); };
...