SWIG:如何将boost :: shared_ptr包装到std :: vector?

时间:2011-04-30 03:38:36

标签: c++ python swig

我有一些C ++代码将boost :: shared_ptr返回给std :: vector,但是我无法让SWIG正确地包装它以使对象在Python中可迭代。如果没有boost :: shared_ptr,它可以正常工作。有没有人知道如何在vector_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

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可能想尝试Boost.PythonPy++。如果您已经在使用Boost,它提供了一个非常好的包装(并且几乎是自动包装)的复杂C ++构造。我在几个项目中使用过它。

另外,您应该看看this question它看起来相关但不完全是您的问题。

答案 1 :(得分:1)

你解决了问题吗?

我认为这可能是名称管理的问题,因为您使用相同的名称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列表。