карта cout с наддувом :: любая

У меня есть "словарь"std::map<std::string, boost::any> (или жеstd::any, если хотите), который может быть вложенным. Теперь я хотел бы отобразить карту. посколькуboost::any очевидно, не играет с<<все становится немного неприятно. Пока что я проверяю тип, разыгрываю его и отправляюcout:

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, ' ') << "}";

Это печатает, например,

{
  fruit: banana
  taste: {
    sweet: 1.0
    bitter: 0.1
  }
}

К сожалению, это вряд ли масштабируется. Я должен был бы добавить ещеelse if условие для каждого типа (например,float, size_t...), поэтому я не особенно доволен решением.

Есть ли способ обобщить вышесказанное на большее количество типов?

Ответы на вопрос(2)

Ваш ответ на вопрос