8

ClassNameを受け入れる C++ 関数にオブジェクト タイプの Python リストを渡すにはどうすればよいvector<ClassName>ですか?

私が見つけた最高のものは、次のようなものです: example . 残念ながら、コードがクラッシュしてしまい、その理由がわかりません。これが私が使用したものです:

template<typename T>
void python_to_vector(boost::python::object o, vector<T>* v) {
    try {
      object iter_obj = object(handle<>(PyObject_GetIter(o.ptr())));
      return;
      for (;;) {
          object obj = extract<object>(iter_obj.attr("next")());
          // Should launch an exception if it cannot extract T
          v->emplace_back(extract<T>(obj));
      }
    } catch(error_already_set) {
        PyErr_Clear();
        // If there is an exception (no iterator, extract failed or end of the
        // list reached), clear it and exit the function
        return;
    }
}
4

2 に答える 2

12

を取る関数があると仮定しますstd::vector<Foo>

void bar (std::vector<Foo> arg)

vectorこれを処理する最も簡単な方法は、を pythonに公開することです。

BOOST_PYTHON_MODULE(awesome_module)
{
    class_<Foo>("Foo")
        //methods and attrs here
    ;

    class_<std::vector<Foo> >("VectorOfFoo")
        .def(vector_indexing_suite<std::vector<foo> >() )
    ;

    .def("bar", &bar)
}

これで、Python でFoos を aに貼り付けvectorて、ベクトルをに渡すことができます。bar

from awesome_module import *
foo_vector = VectorOfFoo()
foo_vector.extend(Foo(arg) for arg in arglist)
bar(foo_vector)
于 2011-01-29T15:55:43.050 に答える
3

私の問題を解決するイテレータを見つけました:

#include <boost/python/stl_iterator.hpp>
template<typename T>
void python_to_vector(boost::python::object o, vector<T>* v) {
    stl_input_iterator<T> begin(o);
    stl_input_iterator<T> end;
    v->clear();
    v->insert(v->end(), begin, end);
}
于 2011-01-27T19:58:54.800 に答える