使用暴露std::vector<struct>boost.python

2024-09-27 22:26:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个现有的c++代码库,它使用std::vector的结构,它应该公开给python。在

在页眉中:

struct sFOO
{
    unsigned int start = 3 ;
    double foo = 20.0 ;
};

在cpp中:

^{pr2}$

对于boost::python snippet:

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_套件,但它无助于暴露预定义的struct vector。在

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

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

从而产生编译错误。在

因为我是C++和Boost的新手,所以任何评论,包括解决方案,搜索技巧,以及建议,以供参考。在

提前谢谢!在


Tags: addfoodefpropertystartstructclassstd
1条回答
网友
1楼 · 发布于 2024-09-27 22:26:37

方法.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>())
;

为了使用向量索引套件,必须将equal to operator实现到它所包含的类:

^{pr2}$

然后可以导出向量:

#include <boost/python/suite/indexing/vector_indexing_suite.hpp>

class_<std::vector<sFOO>>("vector_sFOO_")
   .def(vector_indexing_suite<std::vector<sFOO>>())
;

相关问题 更多 >

    热门问题