variable nonlocal example c++ python boost boost-python

c++ - nonlocal - python global variable in function



Boost.Python call by reference: TypeError: No se ha encontrado el convertidor to_python(by-value) para el tipo C++: (1)

Cambiar B.do_something(a); a B.do_something(boost::ref(a)); .

Consulte Llamar a funciones y métodos de Python en el manual de boost.

Estoy tratando de exponer mis clases de C ++ a Python usando Boost.Python. Aquí hay una versión simplificada de lo que estoy tratando de hacer:

Tengo una clase A que deriva de boost :: noncopyable y una segunda clase B con un método que toma una referencia a A como argumento.

class A : boost::noncopyable { /*...*/ }; class B { public: virtual void do_something(A& a) { /*...*/ } };

Estoy exponiendo las clases de la siguiente manera:

/* Wrapper for B, so B can be extended in python */ struct BWrap : public B, wrapper<B> { void do_something(A &a) { if (override do_something = this->get_override("do_something")) { do_something(a); return; } else { B::do_something(a); } } void default_do_something(A& a) { this->B::do_something(a); } }; BOOST_PYTHON_MODULE(SomeModule) { class_<A, boost::noncopyable>("A"); class_<BWrap, boost::noncopyable>("B") .def("do_something", &B::do_something, &BWrap::default_do_something) ; }

Extiendo B en python así:

test.py:

import SomeModule class BDerived(SomeModule.B): def do_something(self, a): pass

y llamar a la B extendida de esta manera:

try { py::object main = py::import("__main__"); / py::object global(main.attr("__dict__")); / py::object result = py::exec_file("test.py", global, global); / py::object pluginClass = global["BDerived"]; / py::object plugin_base = pluginClass(); / B& plugin = py::extract<B&>(plugin_base) BOOST_EXTRACT_WORKAROUND; A a; B.do_something(a); } catch (py::error_already_set) { PyErr_Print(); }

Sin embargo, esto resulta en un mensaje de error:

TypeError: No to_python (by-value) converter found for C++ type: A

Si A no se deriva de boost::noncopyable el código se ejecuta sin ningún error, pero el argumento a en do_something(A& a) se copia durante la llamada a la función, aunque se pasa por referencia. Pero solo eliminar el requisito no copiable en A no es una opción, ya que está ahí por una razón.

¿Alguna sugerencia de cómo resolver el problema?

Gracias.