Finalmente sono in grado di usare std :: vector in python usando l'operatore []. Il trucco è quello di fornire un contenitore semplice nella confezione spinta C++ che gestisce la roba vettore interna:boost :: python: Python lista a std :: vector
#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)
;
}
L'altra sfida è: Come tradurre liste pitone in std :: vettori? Ho provato ad aggiungere una classe C++ in attesa di uno std :: vector come parametro e aggiunto il codice wrapper corrispondente:
#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)
;
}
Ma se così facendo, io alla fine con il seguente 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> >)
Qualcuno può dirmi come posso accedere alle liste python all'interno della mia funzione C++?
Grazie, Daniel
'boost :: python :: list' può essere eterogeneo, e devi raccogliere eccezioni da' extract'. – eudoxos
mi scuso, l'eccezione da 'extract' sarà tradotta automaticamente in python. Scusate. – eudoxos
sì bello e semplice da fare, solo la documentazione di boost python è così scarsa, e l'operatore [] è nascosto in un modello object_operators diversi livelli nella gerarchia e non è ovviamente un'operazione un elenco. Non ho trovato la loro documentazione del sito web più amichevole. Fare len() un metodo esterno non è così bello come pensano che sia. Plus è questo l'unico modo per scorrere? – CashCow