Lua Metatables を使用して、一部の内部 C++ 関数へのより適切なインターフェイスを作成しようとしています。
これまでのところ動作している私のコードは次のとおりです。(my.get
およびmy.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++ 関数を返すようにすることはできますが、C++ 関数が呼び出されると、 LABELおよびFlashパラメーターlua_pushcfunction
が欠落しています。
の C++ スニペットを次に示しmy.get
ます。
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.
}
}