2015-04-04 28 views
1

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對象。

回答

2

這是否有一些原因?

由於訪問streambuf比改變它更常見,所以這種情況變得更加方便。

通過stringstream添加的特殊功能將無法正常工作,除非緩衝是streambuf,所以它並沒有真正意義的把它當作一個不同的緩衝區stringstream。不過,您可以使用整個基類iostream類接口。

是否可以更改stringstream使用的內部對象streambuf

當然,只是有資格成員訪問:s.iostream::rdbuf(newbuf)。如果緩衝區不是std::stringbuf,您應該類似地限制對rdbuf()訪問者的任何後續調用,以避免非法轉換到該類別。

或者,只是創建一個iostream &參考,並忘記原來的stringstream,除了破壞它的目的。

+0

你說「因爲訪問'streambuf'比改變它更常見,所以這種情況變得更加方便了。」但...爲什麼'std :: stringstream'只有第二個覆蓋:'stringbuf * stringstream :: rdbuf(stringbuf * sb);'? – Siler 2015-04-04 23:47:26

+0

@Siler'filebuf'具有等價的重載,所以我猜他們並不真的希望你通過擁有緩衝區的接口交換緩衝區。說實話有點難以理解。通常適合創建一個新的基類對象。 – Potatoswatter 2015-04-04 23:50:31

相關問題