2011-04-04 50 views
2

编辑:解决,我的错误;在我的答案中解释。在SWIG for Python中包装std :: boost :: shared_ptr的向量

我有这样的:

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

我尝试通过痛饮这样的揭露它:

%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#的小例子,但对我来说并没有帮助。

任何帮助,非常感谢。

回答

0

痛饮似乎型STD的全局变量::载体包装成元组。解决方案是将实体移动到一个类中,并通过该类的一个实例访问它。例如:

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

extern Globals globals; 
0
+0

感谢您的回应,但正如您在我的问题中所看到的,我已经知道如何包装std :: vector。问题是包装一个boost :: shared_ptr的std :: vector。 SWIG似乎将它暴露为一个元组,因为它无法找出它的shared_ptr部分。 – morrog 2011-04-04 21:32:34

+0

您是否看到过这样的内容:http://www.swig.org/Doc1.3/SWIGPlus.html#SWIGPlus_nn34 – sehe 2011-04-04 21:35:14

+0

是的,谢谢,我已阅读过,但没有看到任何相关内容。再次,我可以包装boost :: shared_ptr,我可以包装std :: vector,并按预期工作。这个问题具体是std :: vector >,它在Python中显示为一个元组。 Python可以访问元组,查看其中的内容,操纵元组内的单个实体,但不能追加或修改它,因为它是一个元组。 – morrog 2011-04-05 01:22:47

3

我遇到了一些困难得到指针对象的Python的序列自动转换为指针对象的std::vector。我目前(卡住)使用Swig 1.3;因人而异,如果你正在使用痛饮2.诀窍是在痛饮接口文件实例(与%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上的方法,即使我也使用了SWIG_SHARED_PTR(myObjectT, myObject<T>)

+0

谢谢你,这对我来说! – 2016-10-22 14:21:49

相关问题