C ++ / Lua FFI将userdata呈现为表格?

时间:2017-11-21 23:18:17

标签: c++ lua

我在C ++中有以下简单代码,其中Object是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中实现Object的索引,例如:

local obj = create_an_object()
print(obj.foo)   -- 123

同时print(obj)显示obj为userdata: 0x12345678

是否有可能使用一些metamethod魔法 obj可以用作表格,而print(obj.foo)仍可以打印123?我在Lua 5.1中运行我的代码。

1 个答案:

答案 0 :(得分:0)

我不完全确定您的意思&#34;可以用作表格#34;但是如果您想要打印与默认值"userdata: 0x12345678 = {foo = 123}"不同的内容,那么您&# 39; ll需要分配__tostring metamethod并从中返回一些字符串。如果您需要(或只是"{foo = 123}"),此字符串可能看起来像VBoxDrv.inf

如果您的意思是在为其分配新索引时使其作为表工作,则应使用__newindex metamethod