2012-10-18 42 views
9

以下是不可能的:爲什麼boost :: format不能直接轉換爲std :: string?

std::string s = boost::format("%d") % 1; // error 

你必須明確地調用方法STR():

std::string s = (boost::format("%d") % 1).str(); // OK 

它只會是語法糖,但爲什麼不只是添加轉換?

+0

%不夠重載嗎? :) – jrok

+2

我不確定你在這裏尋找什麼樣的答案。你問是否有任何語義問題阻止Boost實現這樣的事情?或者你只是說,「他們應該這樣做。」 –

+1

我想了解語義問題。我通常認爲boost庫很好設計。 –

回答

9

這是不是一個很好的事情,如果一個案件隱式轉換可能會引發異常。如果向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()調用提供了一些這樣的可能異常,這使得在確保周圍代碼的異常安全時更容易,以及(在這種情況下)暗示要仔細檢查前面的代碼以防止所述異常首先發生。

+0

這兩個答案(這是BigBoss的一個)給出了很好的理由沒有隱式轉換。但我只能接受一個:-) –

+0

@mr_georg謝謝:) – usta

10

我想這樣做的原因是一樣的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::formatterstd::string)和您糾正,要麼爲format("%s.") % (s1 + s2)str(format("%s.") % s1) + s2

相關問題