boost- python Виртуальные функции с реализациями по умолчанию - PullRequest
0 голосов
/ 26 апреля 2020

Рекомендованный способ раскрытия не чистой виртуальной функции в boost python - это обернуть ее, как показано ниже.

boost python do c

struct Base
{
    virtual ~Base() {}
    virtual int f() { return 0; }
};

struct BaseWrap : Base, wrapper<Base>
{
    int f()
    {
        if (override f = this->get_override("f"))
            return f(); // *note*
        return Base::f();
    }

    int default_f() { return this->Base::f(); }
};

Наконец, разоблачение:

class_<BaseWrap, boost::noncopyable>("Base")
    .def("f", &Base::f, &BaseWrap::default_f)
    ;

В документе объясняется

Обратите внимание, что мы выставляем и &Base::f, и &BaseWrap::default_f. Boost. Python необходимо отслеживать 1) функцию диспетчеризации f и 2) функцию пересылки в реализацию по умолчанию default_f. Для этого есть специальная функция def.

Что на самом деле делает эта специальная функция def и в чем разница?

.def("f", &Base::f, &BaseWrap::default_f)
.def("f", &BaseWrap::default_f)

От исходный код в class.hpp::def_impl, я вижу только default_f как функцию перегрузки, добавляемую в пространство имен тоже как & Base :: f . из-за одной и той же подписи default_f заменит & Base :: f .

Есть что-то, что я пропустил? Любые предложения или примеры будут огромной помощью!

...