我正在尝试将LUA API添加到我的C ++程序中,并且试图允许该脚本绘制到我的GUI中。到目前为止,我的lambda函数已经有了:
auto addToDrawList = [](lua_State* L) -> int
{
int DrawType = (int)lua_tonumber(L, -2);
std::string Label = (std::string)lua_tostring(L, -1);
bool found = false;
for (int i = 0; i <= DrawList.size(); i++)
{
if (DrawList[i].Active == false && !found)
{
switch (DrawType)
{
case(0):
break;
case(1):
DrawList[i].Active = true;
DrawList[i].DrawType = Type::TextBox;
DrawList[i].Label = Label;
break;
}
found = true;
}
}
return 0;
};
这是我正在运行的LUA脚本:
const char* LUA_FILE = R"(
addToDrawList(1, "Test")
)";
这就是我将函数推送到LUA堆栈的方式:
lua_State* L = luaL_newstate();
lua_newtable(L);
int uiTableInd = lua_gettop(L);
lua_pushvalue(L, uiTableInd);
lua_setglobal(L, "Ui");
lua_pushcfunction(L, addToDrawList);
lua_setfield(L, -2, "addToDrawList");
问题出在我的第一个脚本中,因为它无法以this
内部的形式进入'DrawList'数组。
因此,为了解决它,我尝试通过执行以下操作将this
添加到lambda的捕获列表中:
auto addToDrawList = [this](lua_State* L) -> int
这似乎可以解决该错误,但是后来我遇到了最后一个脚本的问题:
lua_pushcfunction(L, addToDrawList);
我一直在Internet上寻找修复程序,但是找不到。
lua_pushcfunction()
采用C样式的函数指针。可以将capture-less lambda转换为这样的函数指针,但是captureing lambda不能。
使用lua_pushcclosure()
1代替。它将允许您将用户定义的值(称为lua_pushcclosure()
)与C函数相关联,例如upvalues指针,或仅指向this
的指针,等等。
创建C函数时,可以将一些值与其关联,从而创建C闭包(请参见
DrawList
); 然后,只要调用此函数,这些值就可以访问。要将值与C函数关联,首先应将这些值压入堆栈(当有多个值时,首先压入第一个值)。然后调用§3.4来创建C函数并将其推入堆栈,其中参数lua_pushcclosure
告诉该函数应关联多少个值。n
还会从堆栈中弹出这些值。
1:lua_pushcclosure
只是lua_pushcfunction()
的包装,定义了0个上限值。
例如:
lua_pushcclosure()