我有一个可能嵌套的“字典”std::map<std::string, boost::any>
(或std::any
,如果需要的话)。现在,我想显示地图。由于boost::any
显然与<<
没有很好的搭配,事情变得有点讨厌。到目前为止,我检查的种类,投它和管道投给cout
:cout map with boost :: any
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
,...),这就是为什么我对解决方案不满意的原因。
有没有办法将以上概括为更多类型?
那么不要使用'boost :: any'。如果您想对“可打印”类型进行类型擦除,则需要将打印逻辑粘贴到类型橡皮擦上。我认为有一个实验性的“提升”。TypeErasure“(可能不是Boost本身),它允许你为特定目的合成类型擦除类。 –
你或许可以用'long double','std :: maxint_t'和'std :: maxuint_t'以覆盖所有内置的类型,但正如Kerrek所说,如果你想要一般的打印,你需要它在你的类型橡皮擦。 –
@MartinBonner:你是什么意思“逃避”?代码看起来如何? –