C++ 寄存器非静态C++;Lua中的方法

C++ 寄存器非静态C++;Lua中的方法,c++,class,methods,lua,non-static,C++,Class,Methods,Lua,Non Static,我正在尝试制作一个小型的C++/Lua系统,在这里我将创建我的对象并在Lua中将行为附加到它们。现在我使用的是LuaReaPror(一个带有Lua的C++基本小标题),我的问题是,就我所见,Lua只允许我登记静态类方法(或非静态函数),我做了一点研究,得出了它的结论,因为Lua typedef希望一个方法只有一个参数Lua_State*L,而非静态方法有隐式this 我希望找到一种不依赖于其他库的方法来解决这个问题,我所需要的只是Lua中的非静态类/属性,因此我认为没有理由使用LuaBind+B

我正在尝试制作一个小型的C++/Lua系统,在这里我将创建我的对象并在Lua中将行为附加到它们。现在我使用的是LuaReaPror(一个带有Lua的C++基本小标题),我的问题是,就我所见,Lua只允许我登记静态类方法(或非静态函数),我做了一点研究,得出了它的结论,因为Lua typedef希望一个方法只有一个参数
Lua_State*L
,而非静态方法有隐式
this


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

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

void func_static(MyClass* inst, T arg) {
    inst->func(arg);
}
然后注册一个函数,将该函数作为元函数调用,这样您就可以在lua中执行此操作

blah:x(y)

它将调用函数,该函数将接收
blah
包含的用户数据,以及参数
y
,并使用
blah
调用
func\u static
y

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 }
};
static int Widget\u AddChild(lua\u State*L)
{
Widget*parent=luaW\u检查(L,1);
Widget*child=luaW\u检查(L,2);
if(父项和子项)
{
lua_pushboolean(L,parent->AddChild(child));
返回1;
}
返回0;
}
// ...
静态luaL_reg小部件_元表[]=
{
{“AddChild”,widgetu AddChild},
// ...
{NULL,NULL}
};

我通常把非lua的东西单独归档。在本例中,Widget.cpp/hpp。然后我有一个LuaWidget文件,它只包含我根据需要编写的绑定。(我还有很多snipmate代码片段,可以让编写这些函数变得快速而轻松。如果您使用vim,我很乐意与您分享)

您可能需要研究一下如何使用toLua++()


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

也可以查看一下。它仅用于简单绑定。如果你想要一个成熟的解决方案,也许OOLUA或简单的LUA绑定器就是你需要的。

所以它不意味着是OO还是我错过了什么?在C++方面,它并不意味着非常OO。它的设计就像为C库编写普通的Lua绑定一样。但是,当您使用Lua编码时,您可以使用OO方式定义的函数。e、 g.
w=Widget.new();w:AddChild(v)
如果有帮助,我已经建立了一个示例项目,在单独的存储库中使用LuaWrapper来演示库的基本用法。这正是我所需要的,但我不理解“然后注册一个函数以将该函数作为元函数调用”部分