【发布时间】:2017-09-01 21:29:10
【问题描述】:
我想包装一个 C++ 函数(使用 Pybind11),它返回一个 STL 容器,该容器本身包装在一个智能指针中。一个例子如下所示。函数重载,所以我必须指定签名。
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include "my_class.h"
typedef std::array<std::complex<double>, 4> ArrayComplex4;
PYBIND11_MAKE_OPAQUE(ArrayComplex4);
namespace py = pybind11;
using namespace my_namespace;
PYBIND11_MODULE(my_module, m) {
py::class_<MyClass>(m, "MyClass", py::dynamic_attr())
.def("my_function", (std::unique_ptr<ArrayComplex4> (MyClass::*)(double)) &MyClass::my_function)
.def("my_function", (std::unique_ptr<ArrayComplex4> (MyClass::*)(double, double)) &MyClass::my_function);
}
模块会编译,但是当我尝试在 Python 中使用该函数时会报错:
TypeError:无法将函数返回值转换为 Python 类型!
我确定我只是为 Pybind11 设置了错误。感谢您的帮助!
编辑
问题肯定出在我尝试绑定std::Array 数据类型的过程中。我最终修改了代码以使用std::Vector,然后 Pybind11 没有问题。有关如何绑定 std::Array 容器的信息,请参阅下面的 AS Mackey 的答案。
【问题讨论】: