如何在与LUA脚本一起使用的lambda中引用'this'

问题描述 投票:0回答:1

我正在尝试将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);

Error

我一直在Internet上寻找修复程序,但是找不到。

c++ lua
1个回答
0
投票

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()
© www.soinside.com 2019 - 2024. All rights reserved.