以下是不可能的:爲什麼boost :: format不能直接轉換爲std :: string?
std::string s = boost::format("%d") % 1; // error
你必須明確地調用方法STR():
std::string s = (boost::format("%d") % 1).str(); // OK
它只會是語法糖,但爲什麼不只是添加轉換?
以下是不可能的:爲什麼boost :: format不能直接轉換爲std :: string?
std::string s = boost::format("%d") % 1; // error
你必須明確地調用方法STR():
std::string s = (boost::format("%d") % 1).str(); // OK
它只會是語法糖,但爲什麼不只是添加轉換?
這是不是一個很好的事情,如果一個案件隱式轉換可能會引發異常。如果向format
提供的參數較少,則轉換爲字符串將默認引發異常。 例如
std::string f()
{
boost::format fmt("%d");
// forgot to feed an argument
std::string s = fmt; // throws boost::io::too_few_args
widget.set_title(fmt); // throws boost::io::too_few_args
return fmt; // throws boost::io::too_few_args
}
這樣的隱式轉換使得很難發現和分析可能會拋出異常的代碼部分。但明確的.str()
調用提供了一些這樣的可能異常,這使得在確保周圍代碼的異常安全時更容易,以及(在這種情況下)暗示要仔細檢查前面的代碼以防止所述異常首先發生。
這兩個答案(這是BigBoss的一個)給出了很好的理由沒有隱式轉換。但我只能接受一個:-) –
@mr_georg謝謝:) – usta
我想這樣做的原因是一樣的std::stringstream
,在這種情況下,你也應該使用.str()
到流轉換爲字符串,並同爲boost::formatter
,原因是:
std::string s1 = "Hello ", s2 = "World";
format("%s.") % s1 + s2;
現在,如果boost::formatter
是隱含地轉換爲std::string
,那麼它會產生「Hello.World」,因爲format("%s.") % s1
將被轉換爲「Hello」。然後將其隱式轉換爲std::string
並使用operator+
將其與s2
一起添加,但大多數程序員可能希望擁有「Hello World」。這會成爲混淆錯誤的根源。但是,在沒有隱式轉換存在的編譯器將爲此產生錯誤(因爲沒有operator+
爲boost::formatter
和std::string
)和您糾正,要麼爲format("%s.") % (s1 + s2)
或str(format("%s.") % s1) + s2
%不夠重載嗎? :) – jrok
我不確定你在這裏尋找什麼樣的答案。你問是否有任何語義問題阻止Boost實現這樣的事情?或者你只是說,「他們應該這樣做。」 –
我想了解語義問題。我通常認爲boost庫很好設計。 –