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

How can I find the existing PyObject that holds a C++ object?

Boost , Boost.Python , Chapter 4. Frequently Asked Questions (FAQs)

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

Я заворачиваю функцию, которая всегда возвращает указатель на уже удерживаемый объект C++.

Один из способов сделать это — захватить механизмы, используемые для обертывания класса виртуальными функциями. Если вы сделаете класс обертки с первоначальным аргументом конструктора PyObject* и сохраните этот PyObject* как «я», вы можете вернуться к нему, отбрасывая до этого типа обертки тонкую функцию обертки. Например:

class X { X(int); virtual ~X(); ... };
X* f();  // known to return Xs that are managed by Python objects
// wrapping code
struct X_wrap : X
{
  X_wrap(PyObject* self, int v) : self(self), X(v) {}
  PyObject* self;
};
handle<> f_wrap()
{
  X_wrap* xw = dynamic_cast<X_wrap*>(f());
  assert(xw != 0);
  return handle<>(borrowed(xw->self));
}
...
def("f", f_wrap());
class_<X,X_wrap,boost::noncopyable>("X", init<int>())
 ...
 ;

Конечно, если у X нет виртуальных функций, вам придется использовать<static_cast>вместо<dynamic_cast>без проверки времени выполнения. Этот подход также работает только в том случае, если объект<X>был построен на Python, потому что<X>, построенные на C++, конечно, никогда не являются объектами<X_wrap>.

Другой подход к этому требует, чтобы вы немного изменили свой код C++; если это вариант для вас, это может быть лучшим способом. Работа, к которой мы все равно стремились. Когда<shared_ptr<X>>преобразуется из Python, shared_ptr фактически управляет ссылкой на содержащий объект Python. Когда файл share_ptrпреобразуется обратно в Python, библиотека проверяет, является ли он одним из тех «управляющих объектами Python», и если да, то просто возвращает исходный объект Python. Так что вы можете просто написать<object(p)>, чтобы получить объект Python обратно. Чтобы использовать это, вы должны быть в состоянии изменить код C++, который вы заворачиваете, чтобы он имел дело с shared_ptr вместо исходных указателей.

Есть и другие подходы. Функции, которые получают объект Python, который вы в конечном итоге хотите вернуть, могут быть обернуты тонкой оберткой, которая записывает соответствие между адресом объекта и его содержащим объектом Python, и вы можете увидеть функцию f_wrap в этом отображении, чтобы получить объект Python.


PrevUpHomeNext

Статья How can I find the existing PyObject that holds a C++ object? раздела Boost.Python Chapter 4. Frequently Asked Questions (FAQs) может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 4. Frequently Asked Questions (FAQs) ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:17:18/0.0084521770477295/1