2015-05-07 42 views
5

假設我想throw包含關於某個對象的信息的字符串,但對象實現只有流運算符(<<)的重載,而不是轉換爲字符串。我想要做這樣的事情:我可以在沒有流對象的情況下調用流操作符重載嗎?

throw std::runtime_error("Error, encountered invalid value " + x); 

其中x是超載具有類型(<<)的一個實例。但是,上述不起作用,因爲+未超載爲與const char*兼容的類型。如果x是一個字符串(或強制轉換爲字符串),它的工作,而是我必須這樣做:

std::stringstream s; 
s << "Error, encountered invalid value " << x; 
throw std::runtime_error(s.str()); 

我怎樣才能儘量精簡的第一個例子。在沒有添加任何過載或自定義的功能。標準庫是否提供了一些有用的功能?

+0

超載'運營商+(的std :: string&,X)' – 101010

+0

能不重載+爲對象添加一個字符串? – MiltoxBeyond

+0

@MiltoxBeyond我可以,但我問這個問題,看看是否有可能做到這一點,而不寫任何新的功能/重載。 – arman

回答

4

您可以委託給一個函數:

template <typename T> 
std::string stream(const T& x) { 
    std::ostringstream ss; 
    ss << x; 
    return ss.str(); 
} 

throw std::runtime_error("Error..." + stream(x)); 

這也是什麼boost::lexical_cast做:

throw std::runtime_error("Error..." + boost::lexical_cast<std::string>(x)); 

或者你可以使用一個臨時流,其中涉及有做投自operator<<傳統僅返回basic_ostream<char>&

throw std::runtime_error(
    static_cast<std::ostringstream&&>(std::ostringstream{} << "Error..." << x) 
    .str()); 

或者你可以用這個邏輯到一個單獨的類型的,流時,結果轉換爲string,用於娛樂的緣故:

struct ToStrT { 
    friend std::string operator<<(std::ostream& os, ToStrT) { 
     return static_cast<std::ostringstream&&>(os).str(); 
    } 
}; 

constexpr ToStrT ToStr{}; 

throw std::runtime_error(std::ostringstream{} << "Error..." << x << ToStr); 
+0

@ T.C。糾正。 – Barry

+0

@ T.C。爲什麼要&&? – Barry

+0

引用我的編輯總結:「安撫libC++,在這種情況下,它返回一個'ostringstream &&',它不能轉換爲'ostringstream&'」 –

相關問題