SWIG:如何将boost::shared_ptr封装到std::vector
SWIG: How to wrap boost::shared_ptr to std::vector?
我有一些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列表。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 将可变参数函数的参数封装在类实例中
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 封装C++模板
- 将 RTOS 队列对象封装在仅具有静态分配的 IQueue 自定义接口中
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 当要访问的对象被多次封装时,如何正确使用setter
- 在为嵌套类定义行外友元时,我真的必须打破封装吗?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 如何在类中封装C/C++套接字发送和接收函数?
- 如何使用吸气剂方法实现C++封装
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 我应该通过引用、值或ptr来存储一个完全封装的成员吗