Я связываю, чтобы обернуть функцию 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 не было проблем. См. Ответ AS Mackey ниже, чтобы узнать, как связать std::Array
контейнеры.