根据pybind11文档https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html:
当包含附加头文件pybind11 / stl.h时,std :: vector <> / std :: list <> / std :: array <>,std :: set <> / std :: unordered_set < >和std :: map <> / std :: unordered_map <>以及Python列表,集合和字典数据结构会自动启用。
但是,我无法一辈子都可以使用它。我想我误会了一些东西,所以我希望有人能为我清除它。
这是我期望的工作:
// Test
std::vector<double> test_vec{1,2,3,4,5};
py::list test_list = test_vec;
py::list test_list2(test_vec);
py::list test_list3 = py::cast<py::list>(test_vec);
以下是错误:
error: conversion from ‘std::vector<double>’ to non-scalar type ‘pybind11::list’ requested
py::list test_list = test_vec;
error: no matching function for call to ‘pybind11::list::list(std::vector<double>&)’
py::list test_list2(test_vec);
error: no matching function for call to ‘cast(std::vector<double>&)’
py::list test_list3 = py::cast<py::list>(test_vec)
文档说,应该在tests/test_stl.cpp
中查找该文件应如何工作的示例,但是恐怕我很难理解该文件中正在发生的事情。
答案 0 :(得分:2)
如果包含pybind11/stl.h
,则函数参数和返回值将自动为您创建绑定的转换。您也可以像这样在C ++代码中明确地做到这一点:
#include <pybind11/stl.h>
// [...]
std::vector<double> test_vec{1, 2, 3, 4, 5};
py::list test_list3 = py::cast(test_vec);
但是请记住,这会创建一个副本。有关其他方法,请参考https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html#making-opaque-types和https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html#binding-stl-containers。