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
逻辑应该如下工作 - 是
答案 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