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

mor*_*rog 4 c++ python swig vector shared-ptr

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

我有这个:

std::vector < boost::shared_ptr < Entity > > entities;
Run Code Online (Sandbox Code Playgroud)

我尝试通过 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>
Run Code Online (Sandbox Code Playgroud)

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

import MyModule
print type(MyModule.cvar.entities)
# Output: (type 'tuple')
Run Code Online (Sandbox Code Playgroud)

我已经用谷歌搜索过这个,但找不到任何关于如何包装它的具体例子。一页给出了一个小示例,用于将其包装为 C#,但对我来说没有帮助。

任何帮助是极大的赞赏。

Pau*_*ice 5

我在将 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> > >;
Run Code Online (Sandbox Code Playgroud)

如果没有myObjectPtrT,Swig 似乎没有足够的知识将 Python 指针序列转换myObjectTmyObjectVectorT

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