【问题标题】:Exposing std::vector<struct> with boost.python用 boost.python 暴露 std::vector<struct>
【发布时间】:2017-03-30 01:37:25
【问题描述】:

我有一个现有的 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 sn-p:

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 用于模拟命名空间,因此不能选择使用范围。)

一个编译和导入过程都OK,可以访问singlefoo,但是每次尝试访问vector foos时,都会遇到下面的错误信息。

Python class registered for C++ class std::vector<myName::sFOO, 
std::allocator<myName::sFOO> >

为了规避这个问题, 我首先尝试了vector_indexing_suite,但它没有帮助暴露结构的预定义向量。

我还假设应该有一个与将指针暴露给python相关的解决方案,所以我尝试通过以下方式获取指针:

    .def("get_vector",&myName::myfoo::get_vector) 

产生编译错误。

由于我是 C++ 和 Boost 的新手,任何 cmets 包括解决方案、搜索提示和适当参考的建议都将不胜感激。

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    方法.def("get_vector",&amp;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>>())
    ;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多