mapa cout com boost :: any
Eu tenho um "dicionário"std::map<std::string, boost::any>
(oustd::any
, se você quiser) que possa ser aninhado. Agora, eu gostaria de exibir o mapa. Desde aboost::any
obviamente não joga bem com<<
, as coisas estão ficando um pouco desagradáveis. Até agora, estou verificando o tipo, lançá-lo e canalizá-lo paracout
:
for (const auto &p: map) {
std::cout << std::string(indent + 2, ' ') << p.first << ": ";
if (p.second.type() == typeid(int)) {
std::cout << boost::any_cast<int>(p.second);
} else if (p.second.type() == typeid(double)) {
std::cout << boost::any_cast<double>(p.second);
} else if (p.second.type() == typeid(std::string)) {
std::cout << boost::any_cast<std::string>(p.second);
} else if (p.second.type() == typeid(const char*)) {
std::cout << boost::any_cast<const char*>(p.second);
} else if (p.second.type() == typeid(std::map<std::string, boost::any>)) {
show_map(
boost::any_cast<std::map<std::string, boost::any>>(p.second),
indent + 2
);
} else {
std::cout << "[unhandled type]";
}
std::cout << std::endl;
}
std::cout << std::string(indent, ' ') << "}";
Isso imprime, por exemplo
{
fruit: banana
taste: {
sweet: 1.0
bitter: 0.1
}
}
Infelizmente, isso não é escalável. Eu teria que adicionar outroelse if
cláusula para cada tipo (por exemplo,float
, size_t
, ...), e é por isso que não estou particularmente feliz com a solução.
Existe uma maneira de generalizar o acima para mais tipos?