如何在LUA中创建一个C++兼容的函数对象

How to create a C++ compatible function object in LUA?

本文关键字:C++ 一个 对象 函数 LUA 创建      更新时间:2023-10-16

我正在考虑如何设计我的API,我计划在LUA中拥有一个带有脚本层的C++应用程序。

对于我设计中的几个关键点,我想让用户能够创建一个函数对象,表示他想在LUA中做什么,而不是将这个函数对象从LUA发送到C/C++。

在伪代码中,在C++中,我有一个class T

class T {
...
int num1 = 0;
float num2 = 0.0f;
std::string str{"NONE"};
...
};

我想用LUA提供的function object来操作T的实例,就像一样

void applyFunc(T t,F f){
f(t);
}

问题是,我在LUA中找不到任何创建函数对象的东西,比如C++11 lambda或std::function,或者任何其他可以被视为函数对象的对象。

我真正的观点是:如何在LUA中定义一个C++兼容的函数对象?

问题是,我在LUA中找不到任何创建函数对象的东西,比如C++11 lambda或std::function或任何其他可以被视为函数对象的对象。

这就是function关键字的作用。这个一个lambda。将这些传递给C++并让C++代码调用它们是很容易的。

对此:

void applyFunc(T t,F f){  
f(t);  
}  

原则上很容易:将C++对象指针作为userdata推到Lua堆栈上,并调用Lua函数。问题是Lua代码不能用C++指针做任何事情。

如果您希望Lua代码能够操纵您传递的对象,则需要用C++编写操纵器方法,并将它们公开给Lua。您通常通过为用户数据创建元表来实现这一点。

有一些库,这是自动为C++。如果你想手工(我更喜欢),你可能应该从这里开始。

如果你在谷歌上搜索"C++对象Lua_index",你会发现很多例子。我可以稍后编写一个示例,但我现在正在工作。