在SWIG中为Python包装boost :: shared_ptr的std :: vector

时间:2011-04-04 08:11:00

标签: c++ python vector swig shared-ptr

编辑:解决了,我的错误;在我的回答中解释。

我有这个:

std::vector < boost::shared_ptr < Entity > > entities;

我尝试通过SWIG公开它:

%include "boost_shared_ptr.i"
%include "std_vector.i"

%shared_ptr(Entity)
%include <Entity.h>

namespace std {
    %template(EntityVector) vector<boost::shared_ptr<Entity> >;
};

%include <TheFileWithEntities.h>

然而,在Python中,实体最终成为一个元组:

import MyModule
print type(MyModule.cvar.entities)
# Output: (type 'tuple')

我已经谷歌搜索了这个,但找不到任何关于如何包装它的具体例子。一个页面给出了一个用C#包装它的小例子,但在我的情况下没有用。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

我很难获得指针对象的Python序列,以自动转换为std::vector指针对象。我目前(卡住)使用Swig 1.3; YMMV如果你正在使用Swig 2.诀窍是在Swig接口文件(带%template)中实例化,而不仅仅是向量,而不仅仅是对象,还有指针对象:

%include "std_vector.i"
%template(myObjectT) namespace::of::myObject<T>;
%template(myObjectPtrT) boost::shared_ptr<namespace::of::myObject<T> >;
%template(myObjectVectorT) std::vector<boost::shared_ptr<namespace::of::myObject<T> > >;

如果没有myObjectPtrT,Swig似乎不太了解将Python指针序列转换为myObjectTmyObjectVectorT

更新:出于某种原因,我还未能弄明白,这导致无法从myObjectT调用myObjectPtrT上的方法,即使我也使用过{ {1}}。

答案 1 :(得分:0)

答案 2 :(得分:0)

SWIG似乎将std :: vector类型的全局变量包装到元组中。解决方案是将实体移动到类中,并通过该类的实例访问它。例如:

class Globals
{
public:
     std::vector < boost::shared_ptr < Entity > > entities;
};

extern Globals globals;