C ++ хранит пакет с переменными значениями из функции-члена - PullRequest
0 голосов
/ 18 декабря 2018

Я работаю над созданием простого 2D игрового движка и у меня есть класс, который способен играть роль кнопки в игре.Я пытаюсь сделать функцию-член такой, чтобы пользователь мог дать объекту кнопки функцию, запускаемую при нажатии, а также параметры этой функции.Вот пример кода, который частично выполняет задачу:

class Entity{
public:
template <typename ... fnParams, typename ... fnArgs>
void Set_Click_Action(void(*action)(fnParams ... params), fnArgs ... args) {
action(args ...); //this works correctly. However, I do not
                  //want to call the function here, I want
                  //instead to store the function in the Entity
                  //object
}

void function(int i, double j, std::string k){
std::cout << i << '\n' << j << '\n' << k << '\n';
}
int main(){
Entity entity;
entity.Set_Click_Action(function, 12, 12.5, std::string("String"));
}

Этот код работает правильно, но не достигает моей цели.Я хочу сохранить функцию для последующего использования (при нажатии на объект).Можно ли получить указатель функции и пакет переменных, содержащий аргументы в переменных-членах?Если да, то какова будет стратегия для этого?Я должен отметить, что я довольно новичок в использовании вариадических шаблонов в C ++.Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 18 декабря 2018

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

Вы можете сохранить вызов action() и args... в лямбда-функции и сохранить лямбда-функцию в std::function

К примеру

struct Entity
 {
   std::function<void()> l;

   template <typename ... fnParams, typename ... fnArgs>
   void Set_Click_Action (void(*action)(fnParams ... params),
                          fnArgs ... args)
    { l = [=]{ action(args...); }; }
 };

Очевидно, что вы можете добавить метод Call_Action() для вызова функции.

Ниже приведен полный рабочий пример с Call_Action()метод

#include <iostream>
#include <functional>

class Entity
 {
   private:
      std::function<void()> l;

   public:
      template <typename ... fnParams, typename ... fnArgs>
      void Set_Click_Action (void(*action)(fnParams ... params),
                             fnArgs ... args)
       { l = [=]{ action(args...); }; }

      void Call_Action () const
       { l(); }
 };

void function (int i, double j, std::string k)
 { std::cout << i << '\n' << j << '\n' << k << '\n'; }

int main()
 {
   Entity entity;
   entity.Set_Click_Action(function, 12, 12.5, std::string("String"));

   std::cout << "--- post set\n";

   entity.Call_Action();
 }
...