我有一个现有的c ++代码库,它使用带有std :: vector的结构,应该暴露给python。
标题中的:
struct sFOO
{
unsigned int start = 3 ;
double foo = 20.0 ;
};
在cpp:
namespace myName
{
myfoo::myfoo(){
sFOO singlefoo;
std::vector<sFOO> foos;
}
sFOO singlefoo;
std::vector<sFOO>* myfoo::get_vector(){
return &foos;
}
}
和boost :: python片段:
using namespace boost::python;
class dummy3{};
BOOST_PYTHON_MODULE(vStr)
{
scope myName = class_<dummy3>("myName");
class_<myName::sFOO>("sFOO")
.add_property("start",&myName::sFOO::start)
.add_property("foo",&myName::sFOO::foo)
;
class_<myName::myfoo>("myfoo", no_init)
.def(init<>())
.def("checkfoo",&myName::myfoo::checkfoo)
.add_property("foos",&myName::myfoo::foos)
.add_property("singlefoo",&myName::myfoo::singlefoo)
}
(仅供参考,虚构类dummy3用于模拟命名空间,因此使用范围不是一种选择。)
编译和导入过程没问题,我可以访问singlefoo,但每当我尝试访问vector foos时,都会遇到下面的错误消息。
Python class registered for C++ class std::vector<myName::sFOO,
std::allocator<myName::sFOO> >
为了解决这个问题, 我首先尝试了vector_indexing_suite,但它没有帮助暴露预定义的struct向量。
我还假设应该有一个与暴露指向python相关的解决方案,所以我试着通过以下方式得到一个指针:
.def("get_vector",&myName::myfoo::get_vector)
产生编译错误。
由于我对C ++和Boost都很新手,因此我们将非常感谢任何评论,包括解决方案,搜索提示以及对合适参考的建议。
提前致谢!
答案 0 :(得分:1)
方法.def("get_vector",&myName::myfoo::get_vector)
不起作用,因为它返回一个指向向量的指针,因此有必要通知定义如何管理对象所有权的策略:
class_<myName::myfoo>("myfoo", no_init)
// current code
.def("get_vector", &myfoo::get_vector, return_value_policy<reference_existing_object>())
;
为了使用vector_indexing_suite,有必要对它所持有的类实现equal to operator
:
struct sFOO
{
unsigned int start = 3 ;
double foo = 20.0 ;
bool operator==(const sFOO& rhs)
{
return this == &rhs; //< implement your own rules.
}
};
然后你可以导出矢量:
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
class_<std::vector<sFOO>>("vector_sFOO_")
.def(vector_indexing_suite<std::vector<sFOO>>())
;