boost :: python:Python列表到std :: vector

dmo*_*ock 27 python boost stdvector boost-python

最后我可以使用[]运算符在python中使用std :: vector.诀窍是简单地在boost C++包装器中提供一个处理内部向量内容的容器:

#include <boost/python.hpp>
#include <vector>
class world
{
    std::vector<double> myvec;

    void add(double n)
    {
        this->myvec.push_back(n);
    }

    std::vector<double> show()
    {
     return this->myvec;
    }
};

BOOST_PYTHON_MODULE(hello)
{
    class_<std::vector<double> >("double_vector")
        .def(vector_indexing_suite<std::vector<double> >())
    ;

    class_<World>("World")
     .def("show", &World::show)
        .def("add", &World::add)
    ;
 }
Run Code Online (Sandbox Code Playgroud)

另一个挑战是:如何将python列表转换为std :: vectors?我试图添加一个c ++类,期望std :: vector作为参数,并添加了相应的包装代码:

#include <boost/python.hpp>
#include <vector>
class world
{
    std::vector<double> myvec;

    void add(double n)
    {
        this->myvec.push_back(n);
    }

    void massadd(std::vector<double> ns)
    {
        // Append ns to this->myvec
    }

    std::vector<double> show()
    {
     return this->myvec;
    }
};

BOOST_PYTHON_MODULE(hello)
{
    class_<std::vector<double> >("double_vector")
        .def(vector_indexing_suite<std::vector<double> >())
    ;

    class_<World>("World")
     .def("show", &World::show)
        .def("add", &World::add)
        .def("massadd", &World::massadd)
    ;
 }
Run Code Online (Sandbox Code Playgroud)

但如果这样做,我最终得到以下Boost.Python.ArgumentError:

>>> w.massadd([2.0,3.0])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
    World.massadd(World, list)
did not match C++ signature:
    massadd(World {lvalue}, std::vector<double, std::allocator<double> >)
Run Code Online (Sandbox Code Playgroud)

谁能告诉我如何在我的c ++函数中访问python列表?

谢谢,丹尼尔

Arl*_*ren 29

要使您的C++方法接受您应该使用的Python列表 boost::python::list

void massadd(boost::python::list& ns)
{
    for (int i = 0; i < len(ns); ++i)
    {
        add(boost::python::extract<double>(ns[i]));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,简单易行,只是boost python文档很差,而operator []被隐藏在模板object_operators中,层次结构中有几层,显然不是一个操作列表.我还没有发现他们的网站文档更友好.使len()成为一种外部方法并不像他们认为的那样酷.加上这是迭代的唯一方法吗? (8认同)

rde*_*pes 23

这是我使用的:

#include <boost/python/stl_iterator.hpp>

namespace py = boost::python;

template< typename T >
inline
std::vector< T > to_std_vector( const py::object& iterable )
{
    return std::vector< T >( py::stl_input_iterator< T >( iterable ),
                             py::stl_input_iterator< T >( ) );
}
Run Code Online (Sandbox Code Playgroud)

如果您发现输入类型(py :: object)太宽松,请随意指定更严格的类型(在您的情况下为py :: list).

  • @Sturm,好吧,就像: `std::vector&lt; your_cxx_output_type &gt; result = to_std_vector&lt; your_cxx_output_type &gt;( your_python_iterable );` (2认同)