Вызов члена, полученного от luabind, в качестве сопрограммы - PullRequest
1 голос
/ 23 июня 2011

Документация luabind гласит, что для вызова производного от Lua виртуального члена из C ++ вы создаете класс-оболочку, производный от 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 Ответ

1 голос
/ 23 июня 2011

Итак, я разобрался с ответом на эту проблему.Кажется, самое простое решение - передать 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);
  */
}

Ив Луа:

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