我想拥有可以在C ++和C ++中读/写的C ++对象。 LUA。
我看过:http://www.lua.org/pil/28.html
但是,我不喜欢这个解决方案,因为我的对象有构造函数和析构函数(它们很重要,因为我使用RAII并且这些处理引用计数)。
我在PIL解决方案中不喜欢的是对象是在Lua的堆中分配的。
我想要的是自己创建hte C ++对象,并让lua有办法获取/设置它们。
有人对此有一个很好的教程/链接吗?
坦克!
答案 0 :(得分:6)
一种选择是使用 light userdata,它允许您在C ++堆上分配对象。请参阅lua_pushlightuserdata
的文档。不幸的是,轻的用户数据没有元数据。即使您愿意使用Lua 函数来访问它来获取/设置,您仍然必须执行以下操作:
static int myget(lua_State *L) {
myclass thing = lua_touserdata(L, 1);
lua_pushnumber(thing::getsize());
return 1;
}
不幸的是,因为它是一个轻量级用户数据,所以没有真正的方法可以使这种操作类型安全 - 所有轻度用户数据都被视为相同,并且它们没有元数据。
更好的解决方案是在Lua堆上分配一个完整的用户数据,使用适当的元表,其内容是单个指针到C ++堆上分配的对象。然后,您可以按照 Lua中的编程中的模型进行操作。例如,您可以查看Lua io
库以了解如何处理FILE *
。这样你就可以使用luaL_checkudata
函数编写C接口,它们是安全的,但你仍然有权在C ++堆而不是Lua堆上分配你的对象。
答案 1 :(得分:1)
答案 2 :(得分:1)
我似乎记得一个同事正在做这种事情,Lua和C ++对象都是一等公民,并且完全可以在两个方向上运作。
如果记忆对我有用,那么它基于Lua++,但此时我不确定,抱歉。
答案 3 :(得分:0)
使用展示位置新功能。有关方便的模板,请参阅here:
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;
}
(未经测试,请参阅上面的链接了解详情。)