1

Lua Metatables を使用して、一部の内部 C++ 関数へのより適切なインターフェイスを作成しようとしています。

これまでのところ動作している私のコードは次のとおりです。(my.getおよびmy.setC++ で実装されています)

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.
  }
}
4

1 に答える 1

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;
  }

myExecClosureに似ていますが、スタック インデックス 1 と 2 からではなく、myExec上位値 (例: ) を介して最初の 2 つのパラメーターを読み取ります。luaupvaluindex(1)

于 2015-08-12T15:59:52.773 に答える