2011-05-07 35 views
7

我读过如何在python中向python展示正常向量,但我想知道如何公开和使用向量。例如,我有shared_ptrs的向量如下:Boost Python和向量shared_ptr

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

基于用于曝光的载体材料,我应该能够以露出此类型的类。我想知道的是我怎样才能真正加入它?我如何创建shared_ptr<StatusEffect>的实例,因为我无法访问新的实例,并且shared_ptr可以指向多个派生类型,从而为每个类添加一个静态创建方法有点繁琐。

有没有人有一些指针或可以建议如何做到这一点?寻找好榜样的boost ::蟒蛇什么我想要做的一直是升技棘手

在此先感谢

回答

0

你提到每个类的创建方法(构造函数)会有点乏味,但我认为这就是你需要的。

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 >()); 

} 

“,真”的论点很重要!

+0

我相信这只适用于'boost :: shared_ptr'而不是'std ::' – mavix 2013-05-05 17:31:18

0

你可以部分绑定boost::shared_ptr<StatusEffect>,用Boost.Python省略构造就可以了(使用boost::python::no_init)。要与std::shared_ptr<StatusEffect>有类似的机制,您将要需要定义一个boost::get_pointer<T>()自由功能与T = std::shared_ptr<U>as explained in this other SO thread。下面是一个可行解决方案的草图:

#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>()); 

} 
相关问题