在C++中返回STD::变量的数组

2024-05-14 10:33:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个pybd11接口,它将两个编号数组的元组从C++返回到Python。lambda表达式中的子函数lttb返回两个类型为std::vector<double>std::vector<std::variant<uint32_t, in64_t, double>>的向量

如果我直接返回向量,pybind11/stl.h头可以很好地处理转换。创建doublenumpy数组也可以完美地工作。但是,当尝试创建std::variant的numpy数组时,我得到以下错误

..\subprojects\pybind11\include\pybind11/numpy.h(1159): error C2338: Attempt to use a non-POD or unimplemented POD type as a numpy dtype

有一种方法可以注册结构化类型(https://pybind11.readthedocs.io/en/stable/advanced/pycpp/numpy.html#structured-types)以防止出现此错误消息,但是我只看到一种方法可以使用struct而不是使用std::variant进行注册。有人知道如何创建std::variant的numpy数组吗?应该没有那么难,因为std::vector<std::variant<...>>的转换是开箱即用的。这是密码

    .def("lttb",
         [&](ScopeDataElement& data,
             const std::pair<double, double>& limit,
             int64_t masterTick,
             long double samplingTime,
             size_t destinationSize) {
           auto&& [x, y] =
             data.lttb(limit, masterTick, samplingTime, destinationSize);
           using T = std::decay_t<decltype(x)>::value_type;
           using U = std::decay_t<decltype(y)>::value_type;
           auto arrx = py::array_t<T>(x.size(), x.data());
           auto arry = py::array_t<U>(y.size(), y.data());
           return py::make_tuple(arrx, arry);
         })

Tags: pynumpy类型autodatasizetype数组

热门问题