繁体   English   中英

在Lua中注册非静态C ++方法

[英]Register non-static C++ methods in Lua

我正在尝试创建一个小型的C ++ / Lua系统,在那里我将创建我的对象并在Lua中附加行为。 现在我正在使用LuaWrapper(一个带有基本C ++的小标题到Lua的东西),我的问题是,据我所知Lua只让我注册静态类方法(或非静态函数),一点研究和我想通了,因为Lua typedef需要一个只有一个参数lua_State* L方法,而非静态方法则隐含了this

我希望有一种方法来解决这个问题,而不依赖于其他库,我需要的是Lua中的非静态类/属性,所以我认为没有理由使用LuaBind + Boost或其他重度依赖的包装器。

LuaWrapper并不是要直接连接到类中的非静态函数。 我想这可能是一些特殊的诡计,但这就是我设计它的方式:

static int Widget_AddChild(lua_State* L)
{
    Widget* parent = luaW_check<Widget>(L, 1);
    Widget* child = luaW_check<Widget>(L, 2);
    if (parent && child)
    {
        lua_pushboolean(L, parent->AddChild(child));
        return 1;
    }
    return 0;
}

// ...

static luaL_reg Widget_metatable[] =
{
    { "AddChild", Widget_Addchild },
    // ...
    { NULL, NULL }
};

我通常将非lua的东西保存在一个单独的文件中。 在这种情况下Widget.cpp / hpp。 然后我有一个LuaWidget文件,它只包含我根据需要编写的绑定。 (我还有一些片段片段可以快速轻松地编写这些函数。如果你正在使用vim,我很乐意分享它们)

您可以创建一个静态函数来接受该类的实例和一个参数,并在该实例上调用该函数:

void func_static(MyClass* inst, T arg) {
    inst->func(arg);
}

然后注册一个函数将该函数作为元函数调用,这样你就可以在lua中执行

blah:x(y)

它将调用将接收blah包含的userdata的函数,以及参数y ,并使用blahy调用func_static

您可能希望使用toLua ++( http://www.codenix.com/~tolua/ )。

它可以解析类定义并输出一个c ++代码文件,以使Lua中的非静态类成员可用。

你也可以看看LuaCppWrapper 它仅适用于简单绑定。 如果您想要一个完整的解决方案,可能需要OOLua或Simple Lua Binder。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM