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

时间:2011-09-09 17:58:00

标签: c++ class methods lua non-static

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

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

4 个答案:

答案 0 :(得分:2)

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,我很乐意分享它们)

答案 1 :(得分:1)

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

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

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

blah:x(y)

将调用将接收blah包含的用户数据的函数以及参数y,并使用func_static和{{1}调用blah }。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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