Рекомендованный способ раскрытия не чистой виртуальной функции в 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 .
Есть что-то, что я пропустил? Любые предложения или примеры будут огромной помощью!