Lua Metatables用于函数调用捕获

时间:2015-08-12 14:45:46

标签: c++ lua metatable

我正在尝试使用Lua Metatables为一些内部C ++函数创建一个更漂亮的接口。

这是我的代码到目前为止。 (my.getmy.set在C ++中实现)

function setDefault(t)
  local mt = {
  __index = function(tab,k) return my.get(t,k) end,
  __newindex = function(tab,k,v) return my.set(t,k,v) end
  }
  _G[t] = {}
  setmetatable(_G[t],mt)
end

setDefault("LABEL")

LABEL.Text = "wibble" -- evaluates as my.set("LABEL","Text","wibble")
foo = LABEL.Text -- foo = my.get("LABEL","Text")

到目前为止很好。我想要工作的下一个位是表上的函数调用,如下所示:

LABEL.Flash(500) --must evaluate my.execute("LABEL","Flash", 500)

我知道这会调用my.get("LABEL","Flash") - 我可以返回一个C ++函数(使用lua_pushcfunction),但是当调用C ++函数时,它缺少 LABEL Flash 参数。

这是my.get的C ++片段。

static int myGet(lua_State * l)
{
  std::string p1(luaGetString(l, 1)); // table
  std::string p2(luaGetString(l, 2)); // 'method'

  if (isMethod(p1,p2))
  {
    lua_pushcfunction(l, myExec);
    lua_pushvalue(l, 1); // re-push table
    lua_pushvalue(l, 2); // re-push method
    return 3;
  }
  else
  {
  // do my.get stuff here.
  }
}

1 个答案:

答案 0 :(得分:2)

通过一些小改动,我得到了一些有用的东西:推送一个C 闭包而不是一个C 函数

  if (isMethod(p1,p2))
  {
    lua_pushvalue(l, 1); // re-push table
    lua_pushvalue(l, 2); // re-push method
    lua_pushcclosure(l, myExecClosure,2);
    return 1;
  }

myExecClosuremyExec类似,但它通过upvalues(例如luaupvaluindex(1))而不是堆栈索引1和2读取前两个参数。