在boost.python </pointer *>中包装std :: vector <pointer *>

时间:2011-07-27 17:55:28

标签: c++ pointers vector containers boost-python

从我的研究来看,包含指针类型的std :: vector似乎并不是一件容易的事。例如:

std::vector<GameObject*>

我看过boost python vector_index_suite,但它只是给了我运行时错误:

  

TypeError:找不到C ++类型的to_python(by-value)转换器:   游戏对象*

我已经曝光了GameObject:

class_<GameObject>("GameObject") ...

所以我的理解是开箱即用的解决方案是不可能的。我必须做一些包装?有人可以帮我解决一下我应该从哪里开始吗?

3 个答案:

答案 0 :(得分:2)

解决此问题的方法是明确声明您的类包装器也适用于指针类型。

class_<GameObject, GameObject*>("GameObject") ...

答案 1 :(得分:1)

无法评论@jkp,但他的暗示对我有用。我的简约案例:

RenderWorld.h

class RenderWorld {
    public:
        ...
        void addEntity(RenderEntity* entity) {entities.push_back(entity);};
        std::vector<RenderEntity*> getEntities(void) {return entities;};
    private:
        std::vector<RenderEntity*> entities;
 };

RenderEntity.h

 class RenderEntity {
     public:
         int getID(void) {return 42;};
 };

python-exportage.py.h (编译为exported.pyd)

BOOST_PYTHON_MODULE(exported)
{
    class_<RenderWorld>("RenderWorld")
        .def("addEntity", &RenderWorld::addEntity)
        .def("getEntities", &RenderWorld::getEntities)
    ;

    class_<RenderEntity, RenderEntity*>("RenderEntity")
        .def("getID", &RenderEntity::getID)
    ;

    class_<std::vector<RenderEntity*> >("PyVec")
         .def(boost::python::vector_indexing_suite<std::vector<RenderEntity*> >())
    ;
}

我的python会话:

>>> import exported
>>> world = exported.RenderWorld()
>>> world
<exported.RenderWorld object at 0x00000000024A0E58>
>>> e1 = exported.RenderEntity()
>>> e1
<exported.RenderEntity object at 0x000000000284DF48>
>>> e1.getID()
42
>>> world.addEntity(e1)
>>> world.getEntities()
<exported.PyVec object at 0x000000000234B1B0>  
>>> world.getEntities()[0]
<exported.RenderEntity object at 0x0000000002441F50>
>>> world.getEntities()[0].getID()
42
>>> e1 == world.getEntities()[0]
False

值得注意的是:RenderEntity*将被包裹在另一个对象中。看看这些地址和最后一次检查。它在c ++透视图中是合乎逻辑的,但在python域中则不然。

答案 2 :(得分:0)

您还必须包装GameObject课程。只有成员对象的Python包装器才会生效。如果您不想公开该类的成员,可以省略它们,并且只有一个不透明的对象。

另外,boost :: python在共享指针方面效果很好。这为您提供了安全内存处理的额外好处。您是否有机会将std::vector<GameObject*>更改为std::vector<boost::shared_ptr<GameObject> >?这会更好。