Обертывание чисто виртуального метода с аргументами, используя Boost :: Python - PullRequest
2 голосов
/ 17 февраля 2010

В настоящее время я пытаюсь представить интерфейс C ++ (чисто виртуальный класс) для Python, используя Boost :: Python. Интерфейс c ++:

Agent.hpp

#include "Tab.hpp"
class Agent
{
    virtual void start(const Tab& t) = 0;
    virtual void stop() = 0;
};

И, прочитав «официальный» учебник, мне удалось написать и собрать следующую оболочку Python:

Agent.cpp

#include <boost/python.hpp>
#include <Tabl.hpp>
#include <Agent.hpp>
using namespace boost::python;

struct AgentWrapper: Agent, wrapper<Agent>
{
    public:
    void start(const Tab& t)
    {
        this->get_override("start")();
    }
    void stop()
    {
        this->get_override("stop")();
    }
};

BOOST_PYTHON_MODULE(PythonWrapper)
{
    class_<AgentWrapper, boost::noncopyable>("Agent")
        .def("start", pure_virtual(&Agent::start) )
        .def("stop", pure_virtual(&Agent::stop) )
    ;
}

Обратите внимание, что у меня нет проблем при его создании. Однако меня беспокоит то, что, как вы можете видеть, AgentWrapper :: start, похоже, не передает никаких аргументов Agent :: start in:

void start(const Tab& t)
{
    this->get_override("start")();
}

Как оболочка Python узнает, что "start" получает один аргумент? Как я могу это сделать?

1 Ответ

4 голосов
/ 17 февраля 2010

Функции get_override возвращают объект типа override , который имеет несколько перегрузок для различного числа аргументов. Так что вы должны быть в состоянии сделать это:

void start(const Tab& t)
{
    this->get_override("start")(t);
}

Вы пробовали это?

...