我正在构建一个简单的 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++ 中使用可变参数模板非常陌生。在此先感谢您的帮助。

最佳答案



您可以将 action()args... 的调用保存在 lambda 函数中,并将 lambda 函数保存在 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();
 }

关于C++ 从可变参数成员函数中存储可变参数包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53839863/

10-12 17:50
查看更多