在 boost.python 中包裝 stdvector
如果函式返回 std::vector
型別,並且它直接暴露給 Python,就像
std::vector<float> secondMethod() {
return std::vector<float>();
}
BOOST_PYTHON_MODULE(CppProject) {
boost::python::def("getEmptyVec", secondMethod);
}
然後當函式被呼叫時,Python 會告訴你 No to_python (by-value) converter found for C++ type: std::vector<float, std::allocator<float> >
,因為 Python 需要知道如何處理 std::vector
。
幸運的是, boost.python 在 vector_indexing_suite.hpp
中為我們提供了一個封裝功能 。返回值可以作為 FloatVec
物件處理,其元素可以由 []
操作符訪問,方法是通過公開相應的包裝函式,如下所示。
std::vector<float> secondMethod() {
return std::vector<float>();
}
BOOST_PYTHON_MODULE(CppProject) {
// wrapper function
class_<std::vector<float> >("FloatVec")
.def(vector_indexing_suite<std::vector<float> >());
boost::python::def("getEmptyVec", secondMethod);
}
只需呼叫 list()
和 numpy.asarray()
,結果就可以進一步轉換為 Python 列表或 Numpy 陣列。