определяет шаблон функции ptr(), который позволяет пользователям указывать, как преобразовывать значения указателей C++ в python в контексте реализации переопределяемых виртуальных функций, вызова объектов, вызывающих Python, или явного преобразования объектов C++ в Python. Обычно, при передаче указателей на обратные вызовы Python, указатель копируется, чтобы убедиться, что объект Python никогда не содержит висящей ссылки. Чтобы указать, что новый объект Python должен просто содержать копию указателя p, пользователь может передавать ptr(p) вместо того, чтобы передавать p напрямую. Этот интерфейс предназначен для отражения использования boost::ref(), который также может использоваться для предотвращения копирования референтов.
ptr(p) возвращает экземпляр<pointer_wrapper<>>, который может быть обнаружен с помощью<is_pointer_wrapper<>>метафункции;<unwrap_pointer<>>является метафункцией, которая извлекает исходный тип указателя из<pointer_wrapper<>>. Эти классы можно рассматривать как детали реализации.
Этот пример иллюстрирует использование ptr() для предотвращения копирования объекта:
#include<boost/python/call.hpp>#include<boost/python/ptr.hpp>classexpensive_to_copy{...};voidpass_as_arg(expensive_to_copy*x,PyObject*f){// call the Python function f, passing a Python object built around// which refers to *x by-pointer.//// *** Note: ensuring that *x outlives the argument to f() is ***// *** up to the user! Failure to do so could result in a crash! ***boost::python::call<void>(f,ptr(x));}...
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.