Finalmente puedo usar std :: vector en python usando el operador []. El truco es sencillo proporcionar un recipiente en el envoltorio impulso C++ que maneja el material de vectores internos:boost :: python: lista de Python 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)
;
}
El otro reto es: CÓMO de traducir las listas de Python en std :: vectores? He intentado añadir una clase de C++ esperando un std :: vector como parámetro y añadido el código de contenedor correspondiente:
#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)
;
}
Pero si al hacerlo, termino con la siguiente 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> >)
¿Alguien puede decirme cómo puedo acceder a las listas de Python dentro de mi función C++?
Gracias, Daniel
'boost :: python :: list' puede ser heterogéneo, y usted debe detectar excepciones de' extract'. – eudoxos
mis disculpas, la excepción de 'extract' se traducirá automáticamente a python. Lo siento. – eudoxos
sí, fácil y simple de hacer, solo la documentación de boost python es tan pobre, y el operador [] está escondido en una plantilla object_operators varias capas en la jerarquía y no obviamente una lista de operaciones. No he encontrado la documentación de su sitio web más amigable. Hacer len() un método externo no es tan genial como creen que es. Además, ¿es esta la única forma de iterar? – CashCow