2011-01-27 21 views
7

Nesne türü ClassName'un bir Python listesini vector<ClassName> kabul eden bir C++ işlevine nasıl geçirebilirim?Python listesini Boost.python kullanarak C++ vektörüne geçirme

En iyi bulduğum şunun gibi bir şey: example. Maalesef, kod çöküyor ve nedenini anlayamıyorum. İşte derdi: Bu etmektir işlemek için bir std::vector<Foo>

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

kolay yolu alır fonksiyonu var varsayarsak

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

cevap

10

:

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; 
    } 
} 
+0

Çok teşekkür ederim. Listeden vektöre otomatik dönüşüme sahip olmanın bir yolu var mı? –

+0

Maalesef, hayır. Bununla birlikte, bir liste alan, onu bir vektöre dönüştüren ve çubuk işlevine geçiren python tarafında yazılmış bir işleve sahip olabilirsiniz. Bu C++ çirkinlik biraz gizlemek yardımcı olacaktır. –

3

benim sorunu çözer bir yineleyici Bulundu vector python'a maruz bırakın.

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

Yani şimdi python bir vector içine Foo s yapışabilir ve O piton tarafında bu işi yapmak için daha kolay olurdu bar

from awesome_module import * 
foo_vector = VectorOfFoo() 
foo_vector.extend(Foo(arg) for arg in arglist) 
bar(foo_vector) 
+0

için vektör geçmektedir. Vector_indexing_suite kullanarak vektörü sarın ve python'da neye ihtiyacınız olduğunu ekleyin, C++ 'a teslim etmeden önce –

+0

@Matthew: Bir cevap eklemeye ne dersin? Ne demek istediğini anlamadım. –

İlgili konular