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

时间:2014-02-21 20:25:31

标签: c++ c++11 lua

我正在考虑如何设计我的API,我打算在LUA中使用带有脚本层的C ++应用程序。

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

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

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

我想操纵一个T的实例,其中function object来自LUA,如此

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

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

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

1 个答案:

答案 0 :(得分:1)

  

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

That's what the function keyword does. 这个一个lambda。将这些传递给C ++并让C ++代码调用它们很容易。

至于此:

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

原则上很简单:将C ++对象指针作为userdata推送到Lua堆栈并调用Lua函数。问题是Lua代码无法用C ++指针做任何事情。

如果你想让Lua代码能够操作你传递它的对象,你需要在C ++中编写操纵器方法并将它们暴露给Lua。您通常通过为userdata创建元表来实现。

There are libraries that this that automatically for C++.如果你想手动(我的偏好),你应该开始here

如果你谷歌“C ++对象Lua __index”那应该是你的众多例子。我可以稍后编写一个例子,但我现在正在工作。