32

最後に、[]演算子を使用してPythonでstd::vectorを使用できるようになりました。秘訣は、内部ベクトルのものを処理するBoostC++ラッパーにコンテナーを単純に提供することです。

#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)
    ;
 }

もう1つの課題は、Pythonリストをstd ::vectorに変換する方法です。std ::vectorをパラメーターとして期待するc++クラスを追加しようとし、対応するラッパーコードを追加しました。

#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)
    ;
 }

しかし、そうすると、次の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> >)

C ++関数内でPythonリストにアクセスする方法を教えてもらえますか?

ありがとう、ダニエル

4

4 に答える 4

32

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]));
    }
}
于 2010-09-21T14:51:30.677 に答える
27

これが私が使用するものです:

#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 >( ) );
}

入力タイプ (py::object) が自由すぎる場合は、より厳密なタイプ (あなたの場合は py::list) を自由に指定してください。

于 2013-09-30T10:35:54.817 に答える
2

Python リストから自動変換するには、コンバーターを定義する必要があります。

  1. リストがタイプに変換可能かどうかをチェックします (つまり、それがシーケンスであること。さらに、すべての要素が必要なタイプであるかどうかをチェックすることもできますが、それは 2 番目のステップでも処理できます)。
  2. 最初のステップが成功した場合、新しいオブジェクトを返します。シーケンス要素が必要なものに変換できない場合は、例外をスローします。

私のコード以外に何も見つかりません。このテンプレートをコピーして貼り付けることができます(そのファイルの最後に含まれているさまざまなタイプに特化しています)。

于 2011-08-10T08:16:24.273 に答える