Schließlich kann ich std :: vector in Python mit dem Operator [] verwenden. Der Trick ist, einfach ++ Wrapper einen Container in dem Boost-C zur Verfügung stellen, die das interne Vektor-Material behandelt:boost :: python: Python-Liste zu 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)
;
}
Die andere Herausforderung ist: Howto übersetzt Python-Listen in std :: Vektoren? Ich habe versucht, eine C++ Klasse erwartet einen std :: vector als Parameter hinzuzufügen und hinzugefügt, um den entsprechenden Wrapper-Code:
#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)
;
}
Aber wenn so zu tun, ich am Ende mit dem folgende 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> >)
Kann mir jemand sagen, wie ich auf Python-Listen innerhalb meiner C++ - Funktion zugreifen kann?
Danke, Daniel
'boost :: python :: list' kann heterogen sein, und Sie müssen Ausnahmen von' extract' abfangen. – eudoxos
meine Entschuldigung, Ausnahme von 'extrahieren' wird automatisch in Python übersetzt. Es tut uns leid. – eudoxos
Ja schön und einfach zu tun, nur die Boost-Python-Dokumentation ist so schlecht, und Operator [] ist in einer Vorlage versteckt object_operators mehrere Ebenen in der Hierarchie und nicht offensichtlich eine Operation eine Liste. Ich habe ihre Website-Dokumentation nicht freundlicher gefunden. Len() eine externe Methode zu machen ist nicht so cool, wie sie denken, dass es entweder ist. Plus ist dies der einzige Weg, um durchzulaufen? – CashCow