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

我试图创建一个小的 C++/Lua 系统,在其中我会在 Lua 中创建我的对象并将行为附加到它们上面。目前我正在使用 LuaWrapper(一个具有基本 C++ 到 Lua 的头文件),我的问题是,据我所知,Lua 只允许我注册静态类方法(或非静态函数),经过一些调查,我发现这是因为 Lua typedef 希望一个只有一个参数 lua_State* L 的方法,而非静态方法具有隐式的 this

我希望有一种方法可以解决这个问题,而不依赖其他库,我只需要在 Lua 中使用非静态类/属性,因此我看不到使用 LuaBind+Boost 或其他重度依赖的包装器的理由。

点赞
用户726361
用户726361

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

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

然后注册一个函数作为元函数来调用该函数,使您可以在 Lua 中这样做:

blah:x(y)

这将调用将接收包含在 blah 中的用户数据以及参数 y 的函数,并使用 blahy 调用 func_static

2011-09-09 18:09:58
用户63791
用户63791

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 的文件,其中只包含像这样的绑定,根据需要编写。(我也有一些 SnipMate 片段,可以快速而轻松地编写这些函数。如果你使用 vim,我很乐意分享它们)

2011-09-09 18:14:22
用户890897
用户890897

你可能想调用 toLua++ (http://www.codenix.com/~tolua/)。

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

2011-09-09 18:31:30
用户44740
用户44740

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

2011-09-12 20:55:44