我有一個可能嵌套的「字典」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:你是什麼意思「逃避」?代碼看起來如何? –