Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在SWIG for Python中包装boost::shared_ptr的std::vector_C++_Python_Vector_Swig_Shared Ptr - Fatal编程技术网

C++ 在SWIG for Python中包装boost::shared_ptr的std::vector

C++ 在SWIG for Python中包装boost::shared_ptr的std::vector,c++,python,vector,swig,shared-ptr,C++,Python,Vector,Swig,Shared Ptr,编辑:解决了我的错误;在我的回答中解释 我有这个: std::vector < boost::shared_ptr < Entity > > entities; 我在谷歌上搜索过这个,但找不到任何具体的例子来说明如何包装这个。其中一页给出了一个小例子,说明如何将它包装成C#,但对我的情况没有帮助 非常感谢您的帮助。请参阅,以获取可能有用的信息SWIG似乎将std::vector类型的全局变量包装成元组。解决方案是将实体移动到类中,并通过该类的实例访问它。例如: clas

编辑:解决了我的错误;在我的回答中解释

我有这个:

std::vector < boost::shared_ptr < Entity > > entities;
我在谷歌上搜索过这个,但找不到任何具体的例子来说明如何包装这个。其中一页给出了一个小例子,说明如何将它包装成C#,但对我的情况没有帮助


非常感谢您的帮助。

请参阅,以获取可能有用的信息

SWIG似乎将std::vector类型的全局变量包装成元组。解决方案是将实体移动到类中,并通过该类的实例访问它。例如:

class Globals
{
public:
     std::vector < boost::shared_ptr < Entity > > entities;
};

extern Globals globals;
类全局变量
{
公众:
std::vector>实体;
};
外部全局全局;

我很难让指针对象的Python序列自动转换为指针对象的
std::vector
。我目前正在使用Swig 1.3;如果您使用的是Swig 2,则为YMMV。诀窍是在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> > >;
%包括“std_vector.i”
%模板(myObject)命名空间::of::myObject;
%模板(myObjectPtrT)boost::shared_ptr;
%模板(myObjectVec侵权)std::vector;
没有
myObjectPtrT
,Swig似乎不知道如何将指向
myObjectT
的Python指针序列转换为
myobjectvecort


更新:由于某些原因,我还没有弄清楚,这导致无法从
myObjectPtrT
调用
myObjectT
上的方法,尽管我也使用了
SWIG\u SHARED\u PTR(myObjectT,myObject)

感谢您的回答,但正如您在我的问题中看到的那样,我已经知道如何包装std::vector。问题是如何包装boost::shared_ptr的std::vector。SWIG似乎将其作为一个元组公开,因为它无法理解其中的共享部分。是的,谢谢,我已经读过了,但我没有看到任何相关内容。同样,我可以包装boost::shared_ptr和std::vector,它们可以按预期工作。问题特别是std::vector>,它在Python中显示为元组。Python可以访问元组,查看元组中的内容,操作元组中的各个实体,但它不能追加或修改元组。。。因为它是一个元组。我找出了问题,并用解决方案编辑了我的问题。谢谢你花时间帮忙!我应该提到的是,我们的项目已经从SWIG转移到了pybind11,这就不那么晦涩了。
class Globals
{
public:
     std::vector < boost::shared_ptr < Entity > > entities;
};

extern Globals globals;
%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> > >;