SWIG:如何将boost::shared_ptr封装到std::vector

SWIG: How to wrap boost::shared_ptr to std::vector?

本文关键字:封装 ptr std vector shared boost SWIG      更新时间:2023-10-16

我有一些c++代码将boost::shared_ptr返回给std::vector,但是我无法让SWIG正确地包装它以使对象在Python中可迭代。没有boost::shared_ptr,它工作得很好。有人知道如何包装一个矢量,当它在一个shared_ptr?

下面是演示这个问题的示例:

%module example
%include <std_vector.i>
%include <boost_shared_ptr.i>
%shared_ptr(Inner)
%shared_ptr(InnerVector)
%inline %{
#include <boost/shared_ptr.hpp>
#include <vector>
struct Inner {
  int dummy;
};
typedef std::vector< boost::shared_ptr<Inner> > InnerVector;
typedef boost::shared_ptr<InnerVector> InnerVectorPtr;
InnerVectorPtr getVectorPtr()
{
  InnerVectorPtr v(new InnerVector());
  boost::shared_ptr<Inner> i(new Inner);
  i->dummy = 222;
  v->push_back(i);
  return v;
}
%}
%template(InnerVector) ::std::vector< boost::shared_ptr<Inner> >;

和Python脚本示例:

import example
v = example.getVectorPtr()
print 'Vector is:', v
for i in v:
     print 'Instance is:', i
     print 'Value is:', i.dummy

对我来说,它是这样说的:

Vector is: <Swig Object of type 'InnerVectorPtr *' at 0x1127270>
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    for i in v:
TypeError: 'SwigPyObject' object is not iterable

有什么建议吗?

您可能想要尝试Boost。Python和py++。如果您已经在使用Boost,那么它为复杂的c++结构提供了非常好的包装(并且几乎是自动包装)。我已经在几个项目中使用了它。

你也应该看看这个问题,它看起来很相关,但不是你的问题。

你的问题解决了吗?

我认为这可能是名称管理的问题,因为您两次使用相同的名称InnerVector:

%template(InnerVector) ::std::vector< boost::shared_ptr<Inner> >;

typedef std::vector< boost::shared_ptr<Inner> > InnerVector;

错误TypeError: 'SwigPyObject' object is not iterable通常意味着SWIG不理解对象是例如vector,并且应该转换为Python列表。