将luabind派生成员称为协程

时间:2011-06-22 23:27:13

标签: c++ lua 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);

我认为我需要知道的是如何获取func foo(由Lua派生类实现),然后我现有的resume_function逻辑应该如下工作 - 是

1 个答案:

答案 0 :(得分:1)

所以我已经找到了这个问题的答案。似乎最简单的解决方案是在构造对象时从Lua传递self,然后从其表中查找函数:

在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