我正在构建一个简单的 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/