在Lua中注册非静态c++方法
Register non-static C++ methods in Lua
我正在尝试制作一个小型的c++/Lua系统,在那里我将创建我的对象并在Lua中附加行为。现在我正在使用LuaWrapper(一个带有基本c++到Lua的小头文件),我的问题是,据我所知Lua只允许我注册静态类方法(或非静态函数),一点研究,我认为这是因为Lua类型定义期望一个只有一个参数的方法lua_State* L
和非静态方法有隐式的this
。
我希望有一种方法来解决这个问题,而不依赖于其他库,我所需要的只是Lua中的非静态类/属性,所以我认为没有理由使用LuaBind+Boost或其他重依赖的包装器。
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。然后我有一个luwidget文件,它只包含我根据需要编写的这些绑定。(我还提供了一些代码片段,使编写这些函数变得快速而轻松。如果你正在使用vim,我很乐意分享它们)
您可以创建一个静态函数,它将接受类的一个实例和一个参数,并在实例上调用该函数:
void func_static(MyClass* inst, T arg) {
inst->func(arg);
}
然后注册一个函数作为元函数来调用这个函数,这样你就可以在lua
blah:x(y)
将调用接收blah
包含的用户数据的函数,以及参数y
,并使用blah
和y
调用func_static
。
您可以考虑使用tolua++ (http://www.codenix.com/~tolua/)。
它可以解析类定义并输出一个c++代码文件,使非静态类成员在Lua中可用。
您还可以看看LuaCppWrapper。它仅用于简单绑定。如果你想要一个完整的解决方案,也许你需要的是OOLua或Simple Lua Binder。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++中使用非静态成员函数作为回调函数
- 将静态库链接到不带-fPIC的共享库中
- 静态结构和一个定义规则
- 为什么虚函数不能是静态的和全局的?
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身