用boost.python公开std :: vector <struct>

时间:2017-03-30 01:37:25

标签: python c++ c++11 boost-python

我有一个现有的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都很新手,因此我们将非常感谢任何评论,包括解决方案,搜索提示以及对合适参考的建议。

提前致谢!

1 个答案:

答案 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>>())
;