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

Chapter 7. Utility and Infrastructure

Boost , Boost.Python Reference Manual , Boost.Python Reference Manual

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

Chapter 7. Utility and Infrastructure

определяет метафункцию предиката<has_back_reference<>>, которая может быть специализирована пользователем для указания на то, что экземпляр завернутого класса содержит<PyObject*>, соответствующий объекту Python.

Унарная метафункция, значение которой истинно, является аргументом<pointer_wrapper<>>.

namespace boost { namespace python
{
    template<class WrappedClass> class has_back_reference
    {
        typedef mpl::false_ type;
    };
}}

Метафункция, которую проверяет Boost. Python определяет, как могут быть построены завернутые классы.

<type::value>является интегральной константой, конвертируемой в шар неуказанного типа. Специализации могут заменить действительно ценную интегральную константную обертку для типа iff для каждого вызова<class_<WrappedClass>::def(init<type-sequence...>())>и неявно обернутого конструктора копий (если он не является некопируемым), существует соответствующий конструктор<WrappedClass::WrappedClass(PyObject*,type-sequence...)>. Если такая специализация существует, конструкторы WrappedClass будут вызываться с указателем «обратной ссылки» на соответствующий объект Python всякий раз, когда они вызываются из Python. Самый простой способ обеспечить этот вложенный тип - получить специализацию от<mpl::true_>.

В C++:

#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>
using namespace boost::python;
using boost::shared_ptr;
struct X
{
    X(PyObject* self) : m_self(self), m_x(0) {}
    X(PyObject* self, int x) : m_self(self), m_x(x) {}
    X(PyObject* self, X const& other) : m_self(self), m_x(other.m_x) {}
    handle<> self() { return handle<>(borrowed(m_self)); }
    int get() { return m_x; }
    void set(int x) { m_x = x; }
    PyObject* m_self;
    int m_x;
};
// specialize has_back_reference for X
namespace boost { namespace python
{
  template <>
  struct has_back_reference<X>
    : mpl::true_
  {};
}}
struct Y
{
    Y() : m_x(0) {}
    Y(int x) : m_x(x) {}
    int get() { return m_x; }
    void set(int x) { m_x = x; }
    int m_x;
};
shared_ptr<Y>
Y_self(shared_ptr<Y> self) { return self; }
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.

В Python:

>>> from back_references import *
>>> x = X(1)
>>> x2 = x.self()
>>> x2 is x
1
>>> (x.get(), x2.get())
(1, 1)
>>> x.set(10)
>>> (x.get(), x2.get())
(10, 10)
>>>
>>>
>>> y = Y(2)
>>> y2 = y.self()
>>> y2 is y
0
>>> (y.get(), y2.get())
(2, 2)
>>> y.set(20)
>>> (y.get(), y2.get())
(20, 20)

PrevUpHomeNext

Статья Chapter 7. Utility and Infrastructure раздела Boost.Python Reference Manual Boost.Python Reference Manual может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Boost.Python Reference Manual ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 09:46:32/0.0066649913787842/0