1

luabind のドキュメントには、Lua 派生の仮想メンバーを C++ から呼び出すように記載されています。派生したラッパー クラスを作成し、次luabind::wrap_baseのように関数を呼び出します。

class BaseWrapper : public Base, public luabind::wrap_base
{
    public:
        virtual void foo()
        {
            call<void>("foo");
        }
};

これまでのところとても良いです-私はこれだけ働いています。

しかし、(Lua 側で)BaseWrapper::foo()オーバーライドされたものを で直接呼び出すのではなく、( を使用して)コルーチンとして呼び出すように実装するにはどうすればよいですか?fooresume_functioncall

これは、非メンバー関数で行う方法です。

luabind::object func = luabind::globals(L)["bar"];
luabind::resume_function<void>(func);

私が知る必要があるのはfuncfoo(Lua 派生クラスによって実装されているように) 取得する方法であり、既存のresume_functionロジックはそのまま機能するはずです。

4

1 に答える 1

1

だから私はこの問題の答えを見つけました。最も簡単な解決策はself、オブジェクトを構築するときに Lua から渡し、そのテーブルから関数を検索することです。

C++ 側:

BaseWrapper::BaseWrapper(luabind::object self) : _self(self)
{ }

virtual void BaseWrapper::foo()
{
  luabind::object func = _self["foo"];

  /* now put func in coroutine scheduler queue and when appropriate call: 

     luabind::resume_function<void>(func, _self);
  */
}

そしてLuaでは:

class 'Derived' (Base)
  function Derived:__init()
    Base.__init(self, self)     -- the second self is param to BaseWrapper()
  end

  function Derived:foo()
    -- here is the target function
  end
end
于 2011-06-23T13:32:32.333 に答える