карта 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
...), поэтому я не особенно доволен решением.
Есть ли способ обобщить вышесказанное на большее количество типов?