それ自体がスマート ポインターにラップされている STL コンテナーを返す C++ 関数 (Pybind11 を使用) をラップしようとしています。以下に例を示します。関数はオーバーロードされているため、署名を指定する必要があります。
#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 の回答を参照してください。