编辑:解决了,我的错误;在我的回答中解释。
我有这个:
std::vector < boost::shared_ptr < Entity > > entities;
我尝试通过SWIG公开它:
%include "boost_shared_ptr.i"
%include "std_vector.i"
%shared_ptr(Entity)
%include <Entity.h>
namespace std {
%template(EntityVector) vector<boost::shared_ptr<Entity> >;
};
%include <TheFileWithEntities.h>
然而,在Python中,实体最终成为一个元组:
import MyModule
print type(MyModule.cvar.entities)
# Output: (type 'tuple')
我已经谷歌搜索了这个,但找不到任何关于如何包装它的具体例子。一个页面给出了一个用C#包装它的小例子,但在我的情况下没有用。
非常感谢任何帮助。
答案 0 :(得分:4)
我很难获得指针对象的Python序列,以自动转换为std::vector
指针对象。我目前(卡住)使用Swig 1.3; YMMV如果你正在使用Swig 2.诀窍是在Swig接口文件(带%template
)中实例化,而不仅仅是向量,而不仅仅是对象,还有指针对象:
%include "std_vector.i"
%template(myObjectT) namespace::of::myObject<T>;
%template(myObjectPtrT) boost::shared_ptr<namespace::of::myObject<T> >;
%template(myObjectVectorT) std::vector<boost::shared_ptr<namespace::of::myObject<T> > >;
如果没有myObjectPtrT
,Swig似乎不太了解将Python指针序列转换为myObjectT
到myObjectVectorT
。
更新:出于某种原因,我还未能弄明白,这导致无法从myObjectT
调用myObjectPtrT
上的方法,即使我也使用过{ {1}}。
答案 1 :(得分:0)
答案 2 :(得分:0)
SWIG似乎将std :: vector类型的全局变量包装到元组中。解决方案是将实体移动到类中,并通过该类的实例访问它。例如:
class Globals
{
public:
std::vector < boost::shared_ptr < Entity > > entities;
};
extern Globals globals;