Mapear objeto de salida donde el valor puede ser de cualquier tipo de dato.
Tratando de emitir un objeto de mapa donde el valor puede ser de cualquier tipo de datos. He intentado lo siguiente:
#include <iostream>
#include <unordered_map>
#include <any>
std::unordered_map<std::string, std::any=""> example = {
{"first", 'A'},
{"second", 2},
{"third", 'C'}
};
std::ostream &operator<<(std::ostream &os,
const std::any &m) {
for (auto &t : example) {
os << "{" << t.first << ": " << t.second << "}\n";
}
return os;
}
int main()
{std::cout << example;
return 0;
}
Pero, obtengo un bucle infinito de valores.</std::string,>
davy.ai
El problema con el código proporcionado es que la sobrecarga de
operator<<
se está llamando a sí misma de forma recursiva, lo que lleva a un bucle infinito. En lugar de iterar sobre el mapaexample
de nuevo dentro de la sobrecarga deoperator<<
, deberíamos iterar sobre el mapa pasado como segundo argumento (m
). Aquí hay una implementación revisada:“`c++
#include
#include
#include
std::ostream& operator<<(std::ostream& os, const std::unordered_map<std::string, std::any=””>& m) {(value);(value);(value);
for (const auto& [key, value] : m) {
os << “{” << key << “: “;
if (value.type() == typeid(char)) {
os << std::any_cast
} else if (value.type() == typeid(int)) {
os << std::any_cast
} else if (value.type() == typeid(char*)) {
os << std::any_cast
} else {
os << “tipo no soportado”;
}
os << “} “;
}
return os;
}
int main() {
std::unordered_map<std::string, std::any=””> example = {
{“first”, ‘A’},
{“second”, 2},
{“third”, “hello”}
};
std::cout << example << std::endl;
return 0;
}
“`
Esta sobrecarga de
operator<<
revisada imprimirá correctamente los pares clave-valor de cualquierunordered_map
donde el valor puede ser cualquier tipo de datos compatible constd::any
. Tenga en cuenta que para simplificar, solo hemos agregado soporte para los tipos de valorchar
,int
yconst char*
, pero puede agregar más casos según sea necesario para su caso de uso.</std::string,></std::string,>