C /LUA FFI将用户数据作为表格
C++/Lua FFI to render userdata as a table?
我在c 中具有以下简单代码,其中对象是一个std容器:
static int create_an_object(lua_State* L) {
auto obj = static_cast<Object*>(lua_newuserdata(L, sizeof(Object*)));
*obj = another_valid_obj;
luaL_newmetatable(L, "object_metatable");
lua_pushcfunction(L, object_metatable_function);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
return 1;
}
static int object_metatable_function(lua_State* L) {
string index = luaL_checkstring(L, -1);
if (index == "foo") {
lua_pushnumber(L, 123);
}
// Handles other indices, or throws error.
}
lua_pushcfunction(L, create_an_object);
lua_setglobal(L, "create_an_object");
使用上面的FFI,我可以在LUA中实现对象的索引,例如:
local obj = create_an_object()
print(obj.foo) -- 123
同时print(obj)
表明OBJ是userdata: 0x12345678
。
是否可以使用一些metamethod魔术,以便 obj
可以用作表,而print(obj.foo)
仍然打印123?我正在LUA 5.1中运行代码。
我不确定您的意思是"可以用作表",但是如果您想打印与print(obj)
默认值不同的内容,那么您将需要分配__tostring
MetAmethod并从中返回一些字符串。如果需要的话,此字符串可能看起来像"userdata: 0x12345678 = {foo = 123}"
(或简单的"{foo = 123}"
)。
如果您在为其分配新索引时将其作为表工作,则应使用__newindex
metAmethod。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何自动更新表格数据或数据库
- C /LUA FFI将用户数据作为表格
- 为什么我的数据无法在信号/插槽的表格之间传输
- 用C++读取表格中的数字数据,代码行数最少
- 使用excel表格中的数据填充web文本字段,提交页面,重复