调用 luabind 派生成员作为协程。

luabind 的文档说要从 C++ 中调用 Lua 派生的虚成员,需要创建一个继承自 luabind::wrap_base 的包装类,并像这样调用函数:

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

到目前为止,这么多已经可以使用。

但是,如何实现 BaseWrapper::foo(),以将重写的 foo(在 Lua 方面)作为协程(使用 resume_function)而不是直接使用 call 调用它?

对于非成员函数,方法如下:

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

我认为我需要知道如何为 foo(由 Lua 派生的类实现)获取 func,然后我的现有 resume_function 逻辑应该保持不变。

原文链接 https://stackoverflow.com/questions/6447714

点赞
stackoverflow用户390648
stackoverflow用户390648

我已经找到了这个问题的答案。看起来最简单的解决方案是在构建对象时从 Lua 传递 'self',然后从它的表中查找该函数:

在 C++ 侧:

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

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

  /* 将 'func' 放在协程调度程序队列中,当适当时调用:
  
     luabind::resume_function<void>(func, _self);
  */
}

在 Lua 侧:

class 'Derived' (Base)
  function Derived:__init()
    Base.__init(self, self)     -- 第二个 'self' 是传递给 BaseWrapper() 的参数
  end

  function Derived:foo()
    -- 这里是目标函数
  end
end
2011-06-23 13:32:32