Cómo realizar el envío a través de py::dict en C++ pasando desde pybind11.
Intento pasar una estructura de diccionario (unordered_map) de Python a C++ mediante pybind11. En el lado de Python estoy tratando de hacer lo siguiente:
v1 = {1:3.0, 2:4.0}
v2 = {7:13.0, 8:14.0, 15:22.0}
data = {'ab':v1, 'bz':v2}
cpp_run(data)
En el lado de C++, tengo lo siguiente:
#include <iostream>
#include <pybind11 pybind11.h="">
#include <pybind11 numpy.h="">
#include <pybind11 stl.h="">
namespace py = pybind11;
void cpp_run(py::dict& results) {
for (auto it : results) {
const std::string& name = reinterpret_cast<const std::string&&="">(it.first);
const py::dict& values = reinterpret_cast<const py::dict&&="">(it.second);
for (auto iter : values) {
const int& id = reinterpret_cast<const int&&="">(iter.first);
const double& value = reinterpret_cast<const double&&="">(iter.second);
std::cout << "name:" << name << ", id:" << id << ", value:" << value << std::endl;
}
}
}
Imprime datos basura. Usé reinterpret_cast para satisfacer al compilador de Visual Studio.
davy.ai
Los datos basura que se imprimen podrían ser el resultado de una incorrecta conversión de tipos en el código de C++.
py::dict
ya es una estructura de diccionario en el lado de C++, por lo que no es necesario reinterpretar_cast. De manera similar, los pares clave-valor en el diccionario interno deberían ser casteado comoconst int&
yconst double&
, respectivamente.El código modificado de C++ que debería funcionar correctamente es:
Este código debería imprimir correctamente los valores de
name
,id
yvalue
.