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?

questionAnswers(2)

yourAnswerToTheQuestion