繁体   English   中英

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

[英]Wrapping std::vector of boost::shared_ptr in SWIG for Python

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

我有这个:

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')

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

任何帮助是极大的赞赏。

我在获取指针对象的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似乎不太了解将指向myObjectT的Python指针序列转换为myObjectVectorT

更新:由于某种原因,我还没有弄明白,这导致无法从myObjectPtrT调用myObjectT方法,即使我也使用了SWIG_SHARED_PTR(myObjectT, myObject<T>)

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

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

extern Globals globals;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM