2012-05-14 32 views
5

que tienen un método (o función) que devuelve una referencia a una lista de objetos polimórficos:Boost Python: contenedor polimórfico?

class A { 

}; 
class B : public A { 

}; 


std::list<boost::shared_ptr<A> >& getList(); 

¿Cómo exponer una función de este tipo de impulso :: pitón de manera que cuando se repite en la lista en Python, Vería los diferentes tipos de A sy B s?

Respuesta

4

Primero, asegúrese de que sus clases sean realmente polimórficas (es decir, que tengan al menos una función virtual o un destructor virtual). Su ejemplo anterior no lo hace, aunque estoy seguro de que su caso de uso real sí lo hace. Sin eso, nada de la maquinaria de polimorfismo basada en RTTI de Boost.Python funcionará.

Entonces, si usted ha estado expuesto ambas clases con Boost.Python registradas shared_ptr convertidores para ellos:

#include <boost/python.hpp> 

namespace bp = boost::python; 

BOOST_PYTHON_MODULE(example) { 
    bp::class_<A >("A"); 
    bp::register_ptr_to_python< boost::shared_ptr<A> >(); 
    bp::class_< B, bp::bases<A> >("B"); 
    bp::register_ptr_to_python< boost::shared_ptr<B> >(); 
} 

... eso es todo lo que necesita hacer para asegurarse de Python solamente nunca ve el MOST tipo derivado. No es necesario hacer nada especial para garantizar que A se transfiera a B cuando sea posible.

Eso aún deja la cuestión de cómo ajustar una función que devuelve un contenedor. La más sencilla es probablemente usar la suite indexación incluido con Boost.Python:

http://www.boost.org/doc/libs/1_49_0/libs/python/doc/v2/indexing.html

Hay otras opciones que flotan alrededor de la web (incluyendo una "versión 2" de la suite de indexación que es mejor en muchos aspectos, pero no se incluye con Boost.Python), pero para problemas simples, esta es probablemente la más conveniente.

+0

de hecho, un disco virtual era lo que me faltaba. – shoosh

+0

En cuanto a la cuestión de cómo ajustar una función que devuelve un contenedor: Este método también funciona de manera directa con métodos de exposición que devuelven un boost :: python :: list. Es decir al agregar boost :: shared_ptr a los elementos polimórficos de Python a la lista. La desreferenciación de los punteros al acceder a la lista en tiempo de ejecución se realizará implícitamente como se describe (si existen las definiciones register_ptr_to_python <>). – StefanQ