Наконец, я могу использовать std :: vector в python с помощью оператора []. Хитрость заключается в том, чтобы просто предоставить контейнер в обертке подталкивание C++, который обрабатывает внутренний вектор материал:boost :: python: список Python для 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)
;
}
Другой проблемой является: Howto перевести списки питона в StD :: векторы? Я пытался добавить класс C++, ожидая зЬй :: вектора в качестве параметра и добавлен соответствующий код обертки:
#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)
;
}
Но если это так, я в конечном итоге со следующим 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> >)
Может ли кто-нибудь сказать мне, как я могу получить доступ к спискам python в моей функции C++?
Спасибо, Daniel
'boost :: python :: list' может быть гетерогенным, и вы можете получить исключения из' extract'. – eudoxos
мои извинения, исключение из 'extract' будет автоматически переведено на python. Сожалею. – eudoxos
Да, хорошо и просто сделать, просто документация по boost python настолько бедна, и оператор [] скрыт в шаблоне object_operators несколькими слоями вверх по иерархии и, очевидно, не является операцией списка. Я еще не нашел их документацию на сайте более дружелюбной. Создание len() внешнего метода не так круто, как кажется. Плюс это единственный способ пройти через итерацию? – CashCow