3

我正在尝试制作一个小型 C++/Lua 系统,我将在其中创建我的对象并将行为附加到 Lua 中。现在我正在使用 LuaWrapper (一个带有基本 C++ 到 Lua 东西的小头文件),我的问题是,据我所知,Lua 只让我注册静态类方法(或非静态函数),稍加研究,我认为它是因为 Lua typedef 需要一个只有一个参数的方法lua_State* L,而非静态方法具有隐含的this.

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

4

4 回答 4

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

于 2011-09-09T18:14:22.753 回答
1

您可能想考虑使用 toLua++ ( http://www.codenix.com/~tolua/ )。

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

于 2011-09-09T18:31:30.253 回答
1

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

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

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

blah:x(y)

它将调用将接收blah包含的用户数据以及参数的函数,并使用andy调用。func_staticblahy

于 2011-09-09T18:09:58.557 回答
0

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

于 2011-09-12T20:55:44.980 回答