Чтобы обернуть класс T таким, что его виртуальные функции могут быть «переопределены в Python»— так что соответствующий метод производного класса Python будет называться, когда виртуальная функция используется из C++— вы должны создать класс обертывания C++, полученный из T, который переназначает эти виртуальные функции, чтобы они вызвали на Python. Этот заголовок содержит классы, которые могут быть использованы для облегчения этой работы.
Если * это имеет значимый объект Python, он используется с указанными аргументами в порядке, указанном здесь. В противном случае бросает error_already_set.
Returns
Объект неопределенного типа, который держит результат Python вызова и, при преобразовании в C++ типа R, пытается преобразовать этот объект результата в R. Если это преобразование терпит неудачу, бросает error_already_set.
Если *этот является субобъектом базового класса C++ производного классного экземпляра Python, который переопределяет названную функцию, возвращает определяющий объект, который делегирует на верхнюю часть Python. В противном случае возвращается определяющий объект, который удерживает None.
#include<boost/python/module.hpp>#include<boost/python/class.hpp>#include<boost/python/wrapper.hpp>#include<boost/python/call.hpp>usingnamespaceboost::python;// Class with one pure virtual functionstructP{virtual~P(){}virtualcharconst*f()=0;charconst*g(){return"P::g()";}};structPCallback:P,wrapper<P>{charconst*f(){returnthis->get_override("f")();}};// Class with one non-pure virtual functionstructA{virtual~A(){}virtualcharconst*f(){return"A::f()";}};structACallback:A,wrapper<A>{charconst*f(){if(overridef=this->get_override("f"))returnf();returnA::f();}charconst*default_f(){returnthis->A::f();}};BOOST_PYTHON_MODULE_INIT(polymorphism){class_<PCallback,boost::noncopyable>("P").def("f",pure_virtual(&P::f));class_<ACallback,boost::noncopyable>("A").def("f",&A::f,&ACallback::default_f);}
Статья boost/python/wrapper.hpp раздела Boost.Python Reference Manual Chapter 2. High Level Components может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.