最後,我可以使用[]運算符在python中使用std :: vector。訣竅是簡單的在處理內部向量東西升壓C++包裝提供了一個容器:boost :: python:python list to 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 Python列表轉換成標準::載體?我嘗試添加C++類期待一個std ::向量作爲參數,並加入相應的包裝代碼:
#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> >)
有人能告訴我如何在我的C++函數中訪問python列表嗎?
感謝, 丹尼爾
'boost :: python :: list'可以是異構的,你也可以從'extract'中捕獲異常。 – eudoxos 2011-08-10 08:08:01
我的道歉,'extract'的異常將自動轉換爲python。抱歉。 – eudoxos 2011-08-12 12:30:58
是啊,很好,很簡單,只是提升python文檔是如此之差,並且operator []隱藏在一個模板object_operators層次上的幾個層次,而不是明顯的操作列表。我還沒有發現他們的網站文檔更友好。 使len()成爲外部方法並不像他們認爲的那樣酷。 Plus是否是迭代的唯一方法? – CashCow 2012-12-17 11:00:27