的basic_iostream
類模板包括兩個重載rdbuf()
- 一個是const
成員函數返回一個指針,指向內部流緩衝在使用中,其它採用單個streambuf*
說法,和設置的內部指針。在std :: stringstream的類和rdbuf()成員函數
然而,std::stringstream
過載rdbuf()
功能如下:
stringbuf_type* rdbuf() const;
由於只有「吸氣劑」的版本過載,則「設置器」版本,它需要一個streambuf*
參數是隱藏的(由於member function hiding),和因此無法通過stringstream
實例訪問。
這是否有一些原因?是否有可能更改stringstream使用的內部對象streambuf
?看起來在某些情況下這可能是可取的,例如,您想要使用將所有輸入轉換爲小寫字符串的stringstream對象。在這種情況下,從std::stringbuf
派生的自定義stringbuf類將是理想的。但是,如果沒有rdbuf(streambuf*)
函數,則無法更改stringstream
使用的內部streambuf對象。
那麼,爲什麼不提供std::stringstream
提供的方法設置內部使用的stringbuf對象?
注:爲了避免混淆,我不談論設置字符串流的內部存儲器緩衝器,而我說的是具體地約設置使用的內部std::basic_stringbuf
對象。
你說「因爲訪問'streambuf'比改變它更常見,所以這種情況變得更加方便了。」但...爲什麼'std :: stringstream'只有第二個覆蓋:'stringbuf * stringstream :: rdbuf(stringbuf * sb);'? – Siler 2015-04-04 23:47:26
@Siler'filebuf'具有等價的重載,所以我猜他們並不真的希望你通過擁有緩衝區的接口交換緩衝區。說實話有點難以理解。通常適合創建一個新的基類對象。 – Potatoswatter 2015-04-04 23:50:31