Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

boost/python/register_ptr_to_python.hpp

Boost , Boost.Python Reference Manual , Chapter 5. To/From Python Type Conversion

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

поставляет<register_ptr_to_python>, шаблон функции, который регистрирует преобразование для умных указателей на Python. Полученный объект Python содержит копию преобразованного умного указателя, но ведет себя так, как будто это была обернутая копия указателя. Если тип указателя имеет виртуальные функции и класс, представляющий его динамический (наиболее производный) тип, был обернут, объект Python будет примером обертки для наиболее производного типа. Можно зарегистрировать более одного умного типа указателя для класса указателя.

Обратите внимание, что для преобразования объекта Python<X>в<smart_ptr<X>&>(неконст-ссылка) встроенный объект C++ должен удерживаться<smart_ptr<X>>, и что когда обернутые объекты создаются путем вызова конструктора из Python, то, как они удерживаются, определяется параметром HeldType в<class_<...>>экземплярах.

template <class P>
void register_ptr_to_python()

Requires

<P>[править править код].

Effects

Позволяет конверсию в Python экземпляров P.

Вот пример модуля, который содержит класс 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>
>>>

Статья boost/python/register_ptr_to_python.hpp раздела Boost.Python Reference Manual Chapter 5. To/From Python Type Conversion может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 5. To/From Python Type Conversion ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 01:45:27/0.0057930946350098/1