определяет метафункцию предиката<has_back_reference<>>, которая может быть специализирована пользователем для указания на то, что экземпляр завернутого класса содержит<PyObject*>, соответствующий объекту Python.
Метафункция, которую проверяет Boost. Python определяет, как могут быть построены завернутые классы.
<type::value>является интегральной константой, конвертируемой в шар неуказанного типа. Специализации могут заменить действительно ценную интегральную константную обертку для типа iff для каждого вызова<class_<WrappedClass>::def(init<type-sequence...>())>и неявно обернутого конструктора копий (если он не является некопируемым), существует соответствующий конструктор<WrappedClass::WrappedClass(PyObject*,type-sequence...)>. Если такая специализация существует, конструкторы WrappedClass будут вызываться с указателем «обратной ссылки» на соответствующий объект Python всякий раз, когда они вызываются из Python. Самый простой способ обеспечить этот вложенный тип - получить специализацию от<mpl::true_>.
#include<boost/python/class.hpp>#include<boost/python/module.hpp>#include<boost/python/has_back_reference.hpp>#include<boost/python/handle.hpp>#include<boost/shared_ptr.hpp>usingnamespaceboost::python;usingboost::shared_ptr;structX{X(PyObject*self):m_self(self),m_x(0){}X(PyObject*self,intx):m_self(self),m_x(x){}X(PyObject*self,Xconst&other):m_self(self),m_x(other.m_x){}handle<>self(){returnhandle<>(borrowed(m_self));}intget(){returnm_x;}voidset(intx){m_x=x;}PyObject*m_self;intm_x;};// specialize has_back_reference for Xnamespaceboost{namespacepython{template<>structhas_back_reference<X>:mpl::true_{};}}structY{Y():m_x(0){}Y(intx):m_x(x){}intget(){returnm_x;}voidset(intx){m_x=x;}intm_x;};shared_ptr<Y>Y_self(shared_ptr<Y>self){returnself;}BOOST_PYTHON_MODULE(back_references){class_<X>("X").def(init<int>()).def("self",&X::self).def("get",&X::get).def("set",&X::set);class_<Y,shared_ptr<Y>>("Y").def(init<int>()).def("get",&Y::get).def("set",&Y::set).def("self",Y_self);}
Следующая сессия Python иллюстрирует, что x.self() возвращает тот же объект Python, на который он вызван, в то время как y.self() должен создать новый объект Python, который относится к тому же экземпляру Y.
Статья Chapter 7. Utility and Infrastructure раздела Boost.Python Reference Manual Boost.Python Reference Manual может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.