поставляет<register_ptr_to_python
>, шаблон функции, который регистрирует преобразование для умных указателей на Python. Полученный объект Python содержит копию преобразованного умного указателя, но ведет себя так, как будто это была обернутая копия указателя. Если тип указателя имеет виртуальные функции и класс, представляющий его динамический (наиболее производный) тип, был обернут, объект Python будет примером обертки для наиболее производного типа. Можно зарегистрировать более одного умного типа указателя для класса указателя.
Обратите внимание, что для преобразования объекта Python<X
>в<smart_ptr<X>&
>(неконст-ссылка) встроенный объект C++ должен удерживаться<smart_ptr<X>
>, и что когда обернутые объекты создаются путем вызова конструктора из Python, то, как они удерживаются, определяется параметром HeldType в<class_<...>
>экземплярах.
Вот пример модуля, который содержит класс A с виртуальными функциями и некоторыми функциями, которые работают с бустером::shared_ptr.
В C++:
struct A
{
virtual int f() { return 0; }
};
shared_ptr<A> New() { return shared_ptr<A>( new A() ); }
int Ok( const shared_ptr<A>& a ) { return a->f(); }
int Fail( shared_ptr<A>& a ) { return a->f(); }
struct A_Wrapper: A
{
A_Wrapper(PyObject* self_): self(self_) {}
int f() { return call_method<int>(self, "f"); }
int default_f() { return A::f(); }
PyObject* self;
};
BOOST_PYTHON_MODULE(register_ptr)
{
class_<A, A_Wrapper>("A")
.def("f", &A::f, &A_Wrapper::default_f)
;
def("New", &New);
def("Ok", &Call);
def("Fail", &Fail);
register_ptr_to_python< shared_ptr<A> >();
}
В Python:
>>> from register_ptr import *
>>> a = A()
>>> Ok(a) # ok, passed as shared_ptr<A>
0
>>> Fail(a) # passed as shared_ptr<A>&, and was created in Python!
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: bad argument type for built-in operation
>>>
>>> na = New() # now "na" is actually a shared_ptr<A>
>>> Ok(a)
0
>>> Fail(a)
0
>>>
Если share_ptrзарегистрировано следующим образом:
class_<A, A_Wrapper, shared_ptr<A> >("A")
.def("f", &A::f, &A_Wrapper::default_f)
;
Будет ошибка при попытке конвертировать shared_ptrв shared_ptr:
>>> a = New()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: No to_python (by-value) converter found for C++ type: class boost::shared_ptr<struct A>
>>>