![](/img/trans.png)
[英]Using a std::stringstream from static member function for simplicity
[英]The std::stringstream class and rdbuf() member function
basic_iostream
類模板包含rdbuf()
兩個重載-一個是const
成員函數,該函數返回使用中的內部streambuf的指針,另一個是使用單個streambuf*
參數並設置內部指針的。
但是, std::stringstream
重載rdbuf()
函數,如下所示:
stringbuf_type* rdbuf() const;
由於僅重載了“ getter”版本,因此帶有streambuf*
參數的“ setter”版本被隱藏(由於成員函數 hidden),因此無法通過stringstream
實例進行訪問。
這樣做有什么原因嗎? 是否可以更改stringstream使用的內部streambuf
對象? 在某些情況下,這似乎是可取的,例如-例如,您要使用將所有輸入都轉換為小寫的stringstream對象。 在這種情況下,從std::stringbuf
派生的自定義stringbuf類將是理想的。 但是,如果沒有rdbuf(streambuf*)
函數,就無法更改stringstream
使用的內部streambuf對象。
那么,為什么std::stringstream
提供一種設置內部使用的stringbuf對象的方法?
注意 :為避免混淆,我不是在談論設置std::basic_stringbuf
的內部內存緩沖區 ,而是在專門談論設置內部使用的std::basic_stringbuf
對象。
這樣做有什么原因嗎?
由於訪問streambuf
比更改它更常見,因此該情況更加方便。
除非緩沖區是streambuf
,否則stringstream
添加的特殊功能將不起作用,因此將其視為具有不同緩沖區的stringstream
並沒有任何意義。 但是,您可以使用整個基本iostream
類接口。
是否可以更改stringstream使用的內部
streambuf
對象?
當然,只需限定成員訪問權限即可: s.iostream::rdbuf( newbuf )
。 如果緩沖區不是std::stringbuf
,則應該類似地限定對rdbuf()
訪問器的任何后續調用,以避免對該類的非法轉換。
或者,只需創建一個iostream &
引用,然后忘記原始的stringstream
,以銷毀它為目的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.