C++类和Lua
我希望有一些 C++ 对象,可以在 C++ 和 Lua 中读取/写入。
我已经查看了:http://www.lua.org/pil/28.html
但是,我不喜欢那个解决方案,因为我的对象具有构造函数和析构函数(它们很重要,因为我使用 RAII,这些函数负责引用计数)。
在 PIL 解决方案中,我不喜欢的是对象分配在 Lua 的堆中。
相反,我希望自己创建 C++ 对象,然后让 Lua 有一种方式来对它们进行 get/set 操作。
有人有一个好的教程/链接吗?
谢谢!
原文链接 https://stackoverflow.com/questions/2785043
一种选择是使用_light_ userdata,它允许您在C++堆上分配对象。请参阅 lua_pushlightuserdata
的文档。不幸的是,light userdata 没有元表。即使您愿意使用Lua 函数 进行get / set来访问它,您仍然需要执行以下操作:
static int myget(lua_State *L) {
myclass thing = lua_touserdata(L, 1);
lua_pushnumber(thing::getsize());
return 1;
}
不幸的是,由于它是light userdata,没有真正的方法使此操作具有类型安全性--所有的light userdata都被视为相同的,也没有元表。
更好的解决方案是在Lua堆上分配一个完整的userdata,其中包含指向在C++堆上分配的对象的单个指针,并具有适当的元表。然后,您可以遵循_Programming in Lua_中的模型。例如,您可以查看Lua io
库来了解如何处理 FILE *
。这样,您就可以使用luaL_checkudata
函数编写C接口,并且它们将是安全的,但是您仍然可以在C++堆上分配您的对象,而不是在Lua堆上分配它们。
使用放置新对象。详见此处中的方便模板:
template< typename T >
void my_newuserdata( lua_State * L ) {
new ( reinterpret_cast< T * >( lua_newuserdata( L, sizeof( T ) ) ) ) T();
}
template< typename T >
int my_gc( lua_State * l ) {
reinterpret_cast< T * >( lua_touserdata( L, 1 ) )->~T();
return 0;
}
(未经测试,请参见上面的链接以获取更多细节。)
我好像记得有个同事搞过这种事情,Lua 和 C++ 对象都是一等公民,在两个方向上完全可操作。
如果我没记错的话,这是基于 Lua++ 的,但是现在我不确定,抱歉。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
似乎使用工厂模式是个好主意?例如,不仅通过 Lua 中的“标准”方法动态创建对象,而是可以调用 Create 和 Destroy 函数来创建和销毁对象。