在 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 数组。