2013-01-17 38 views
2

如何stringstream的工作,當你這樣做:C++字符串流

stringstream ss; 
ss << "123" << "abc"; 

不會創建暴殄天物「123ABC」字符串或者它連續做兩個操作的stringstream的?

我想複製這種功能,但沒有過載我看來有兩個參數,如上面的代碼工作...

+0

我不是專家,但<<是stringstream類的重載操作符,所以我想通過從左到右的內容附加每個操作一次。 –

+0

您是否正在嘗試爲您的班級創建一個操作符<<? –

+0

是的,但默認<<超載似乎只有一個參數,如:ss <<「123」;而不是像上面的兩個參數... –

回答

12

這是做< <運營商的兩個不同的函數調用相當於:

(ss.operator<<("123")).operator<<("abc") 

所以是的,它可以「連續地」執行兩個操作。

+0

@aschepler謝謝,明白了。 – zdan

+0

-1錯誤的答案。沒有成員函數需要'const char *'。看到我的答案。 – Nawaz

1

std::stringstream::operator<<(const char*)返回std::stringstream&

這種技術可以讓你「鏈接」它。

這不完全正確 - 但它幾乎等同於您的目的的真相。

稍微更準確的陳述是std::stringstream& operator<<(std::stringstream&, const char*)可以被鏈接。

一個更準確的說法是,ostream& operator<<(ostream&, const char*)存在,std::stringstreamostream,然後對超載電話<<決議。

+0

不錯,正是我在找的,謝謝! –

+0

-1錯誤的答案。沒有成員函數需要'const char *' – Nawaz

+0

嗯,它不會讓你連鎖<< = ...無賴。像:ss << =「123」<<「abc」; –

5

其實這是相同的:

std::operator<<(std::operator<<(ss, "123"), "abc"); 

注意有沒有成員函數,它接受const char*作爲參數。它是一個非成員函數,並將ss作爲第一個參數傳遞給它,並將const char*作爲第二個參數傳遞。該函數返回std::ostream&然後再次傳遞給它。它更像這樣:

print(print (ss, "123"), "abc"); //just for clarity 

這意味着有兩個函數調用。將print替換爲std::operator<<。現在一切都會清楚。

希望有所幫助。


其他答案,這樣說:

(ss.operator<<("123")).operator<<("abc") //copied from other answer (wrong) 

是錯誤的!這是錯誤的,因爲它假定operator<<這需要const char*作爲參數是一個成員函數,這是不正確的!