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

标签 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 用于模拟命名空间,因此不能使用作用域。)

A编译和导入过程都OK,我可以访问singlefoo,但是每当我尝试访问vector foo时,我遇到下面的错误信息。

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

为了避免这个问题, 我首先尝试了 vector_indexing_suite,但它无助于公开结构的预定义 vector 。

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

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

产生编译错误。

由于我是 C++ 和 Boost 的新手,因此非常感谢任何评论,包括解决方案、搜索提示以及对合适引用的建议。

提前致谢!

最佳答案

方法 .def("get_vector",&myName::myfoo::get_vector) 不起作用,因为它返回一个指向 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.
    }
};

然后你可以导出 vector :

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

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

关于python - 使用 boost.python 公开 std::vector<struct>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43107005/

相关文章:

python - 如何在python3中执行部分映射交叉?

python - Tensorflow:如何批量获取每个实例的梯度?

python - 为Langchain创建load_summarize_chain,指定chain_type=map_reduce。使用提示时出现错误

c++ - 为什么 stoi/atoi 向我提供编译器错误?

c++ - SOCI 行集<行> 奇怪的错误

python - PyTorch 中的 LSTM 分类名称

c++ - Boost MPL排序模板参数包

C++11 在 Lambda 中捕获成员变量

c++ - 如何使用成员函数创建 packaged_task?

c++ - 避免 std::map::find() 的 key 构造