我正在尝试创建一个小型的C ++ / Lua系统,在那里我将创建我的对象并在Lua中为它们附加行为。现在我正在使用LuaWrapper(一个带有基本C ++的小标题到Lua的东西),我的问题是,据我所知Lua只让我注册静态类方法(或非静态函数),一点研究和我想通了,因为Lua typedef需要一个只有一个参数lua_State* L
的方法,而非静态方法则需要隐式this
。
我希望找到一种方法来解决这个问题,而不依赖于其他库,我需要的只是Lua中的非静态类/属性,所以我认为没有理由使用LuaBind + Boost或其他重度依赖包装器。
答案 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。