2011-05-07 9 views
7

He leído cómo exponer vectores normales a python en boost python, pero quiero saber cómo exponer y hacer uso de un vector. Por ejemplo, tengo un vector de shared_ptrs como sigue:Boost Python y vectores de shared_ptr

std::vector<shared_ptr<StatusEffect> > Effects; 

Basado en el material para la exposición de los vectores, que debería ser capaz de exponer este tipo de clase. Lo que quiero saber es cómo puedo realmente agregarle algo. ¿Cómo creo instancias de shared_ptr<StatusEffect> ya que no tengo acceso a las nuevas, y shared_ptr puede apuntar a múltiples tipos derivados haciendo que la adición de un método de creación estático a cada clase sea un poco tedioso.

¿Alguien tiene algunos consejos o puede sugerir cómo hacerlo? Encontrar un buen ejemplo de impulso :: pitón para lo que yo quiero hacer ha sido un poco complicado

Gracias de antemano

Respuesta

0

Menciona que un método de creación (constructor) para cada clase sería un poco tedioso, pero creo que eso es lo que necesita.

0
struct A { 
    int index; 
    static shared_ptr<A> create() { return shared_ptr<A>(new A); } 
    std::string hello () { return "Just nod if you can hear me!"; } 
}; 

BOOST_PYTHON_MODULE(my_shared_ptr) 
{ 
    class_<A, shared_ptr<A> >("A",boost::python::init<>()) 
     .def("create",&A::create) 
     .staticmethod("create") 
     .def("hello",&A::hello) 
     .def_readonly("index",&A::index) 
    ; 

    boost::python::class_<std::vector<shared_ptr<A>>>("PyVec") 
    .def(boost::python::vector_indexing_suite<std::vector<shared_ptr< A>>,true >()); 

} 

¡El argumento de ", verdadero" es importante!

+0

Creo que esto solo funciona para 'boost :: shared_ptr' y no' std :: ' – mavix

0

Puede enlazar parcialmente boost::shared_ptr<StatusEffect>, omitiendo la construcción muy bien con Boost.Python (use boost::python::no_init). Para tener un mecanismo similar con std::shared_ptr<StatusEffect>, deberá también definir una función libre boost::get_pointer<T>() con T = std::shared_ptr<U>as explained in this other SO thread. Aquí hay un boceto de una solución viable:

#include <boost/python.hpp> 
#include <memory> 
... 

namespace boost { 
    template<class T> T* get_pointer(std::shared_ptr<T> p) { return p.get(); } 
} 

BOOST_PYTHON_MODULE(yourmodule) { 

    using namespace boost::python; 

    class_<StatusEffect, std::shared_ptr<StatusEffect>, boost::noncopyable>("StatusEffect", no_init); 

    class_<std::vector<std::shared_ptr<StatusEffect> > >("StatusEffectVector") 
    .def(boost::python::vector_indexing_suite<std::vector<shared_ptr<StatusEffect>>, true>()); 

} 
Cuestiones relacionadas