Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;存储来自可变成员功能的可变数据包_C++_Function Pointers_Variadic Templates_Variadic Functions_Member Functions - Fatal编程技术网

C++ C++;存储来自可变成员功能的可变数据包

C++ C++;存储来自可变成员功能的可变数据包,c++,function-pointers,variadic-templates,variadic-functions,member-functions,C++,Function Pointers,Variadic Templates,Variadic Functions,Member Functions,我正在构建一个简单的2D游戏引擎,并且有一个类可以在游戏中充当按钮。我试图创建一个成员函数,这样用户就可以在单击按钮对象时给它一个要运行的函数,以及该函数的参数。以下是部分完成任务的代码示例: class Entity{ public: template <typename ... fnParams, typename ... fnArgs> void Set_Click_Action(void(*action)(fnParams ... params), fnArgs ... ar

我正在构建一个简单的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"));
}
类实体{
公众:
模板
无效集\单击\操作(无效(*操作)(fnParams…params),fnArgs…args){
action(args…)//这是正确的。但是,我没有
//想在这里调用函数,我想
//而是将函数存储在实体中
//反对
}
void函数(int i,double j,std::string k){
标准::cout
这段代码工作正常,但没有达到我的目标。我想存储函数以供以后使用(当单击对象时)。是否可以将函数指针和保存参数的变量包获取到成员变量中?如果可以,那么执行此操作的策略是什么

您可以将
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...); }; }
 };

制作一个lambda并将其存储为
std::function
。或者,让
Set\u Click\u Action
接受一个函数对象(然后不需要fnArgs,因为用户可以传递绑定函数)。这非常有效,非常感谢您的快速响应。
#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();
 }