【发布时间】:2026-01-29 15:45:01
【问题描述】:
我有一些 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
有什么建议吗?
【问题讨论】:
-
为什么要返回指向向量的共享指针?
-
因为向量可以有大量条目,我想避免它在返回时被复制,因为该函数会被频繁调用。我可以改为返回对向量的引用(尽管 SWIG 不喜欢那样),但这意味着调用者必须更加小心。但如果你有更好的建议,我会全力以赴。
-
如果您还没有进行分析以表明复制该向量是一个问题,我不会担心它并复制您想要的所有内容。
-
这是一个公平的观点,但我很确定分析在这里不会带来任何惊喜 - 向量包含大约 1000 个要在屏幕上每秒绘制多次的项目,所以如果我删除共享指针我无疑必须重构代码以缓存向量,以免帧速率受到影响...编辑:另外,我讨厌仅仅因为 Python 包装器不符合要求而不得不更改我的精细 C++ 代码;- )