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

2 投票
2 回答
2579 浏览
提问于 2025-04-16 16:42

我有一些C++代码,它返回一个指向std::vector的boost::shared_ptr,但我无法让SWIG正确处理这个指针,以便在Python中可以遍历这个对象。如果没有boost::shared_ptr的话,它运行得很好。有没有人知道如何处理一个在shared_ptr里的vector?

这里有一个示例来展示这个问题:

%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 个回答

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 的列表。

1

你可以试试 Boost.PythonPy++。如果你已经在用Boost,它能很好地处理复杂的C++结构,基本上是自动化的包装。我在几个项目中用过它。

另外,你也可以看看 这个问题,虽然它和你的问题不完全一样,但看起来有点相关。

撰写回答