C++ C++;存储来自可变成员功能的可变数据包
我正在构建一个简单的2D游戏引擎,并且有一个类可以在游戏中充当按钮。我试图创建一个成员函数,这样用户就可以在单击按钮对象时给它一个要运行的函数,以及该函数的参数。以下是部分完成任务的代码示例: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
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();
}