簡體   English   中英

std :: stringstream類和rdbuf()成員函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM