basic_iostream
类模板包含rdbuf()
的两个重载 - 一个是const
成员函数,它返回一个指向正在使用的内部streambuf的指针,另一个需要一个streambuf*
参数,设置内部指针。
但是,std::stringstream
重载了rdbuf()
函数,如下所示:
stringbuf_type* rdbuf() const;
由于只有“getter”版本被重载,因此隐藏了streambuf*
参数的“setter”版本(由于member function hiding),因此无法通过stringstream
实例访问
有没有理由这样做?是否可以更改字符串流使用的内部streambuf
对象?在某些情况下似乎这可能是合乎需要的,例如,您希望使用将所有输入转换为小写的stringstream对象。在这种情况下,从std::stringbuf
派生的自定义stringbuf类将是理想的。但是,如果没有rdbuf(streambuf*)
函数,则无法更改stringstream
使用的内部streambuf对象。
那么,为什么std::stringstream
没有提供设置所使用的内部stringbuf对象的方法呢?
注意 :为了避免混淆,我不谈论设置内部内存缓冲区 stringstream,而不是我特别谈论设置使用的内部std::basic_stringbuf
对象。
答案 0 :(得分:2)
有没有理由这样做?
由于访问streambuf
比更改它更常见,因此更方便。
除非缓冲区是stringstream
,否则streambuf
添加的特殊功能将无效,因此将其视为具有不同缓冲区的stringstream
并不合理。但是,您可以使用整个基本iostream
类接口。
是否可以更改字符串流使用的内部
streambuf
对象?
当然,只需限定会员访问权限:s.iostream::rdbuf( newbuf )
。如果缓冲区不是rdbuf()
,您应该同样限定对std::stringbuf
访问者的任何后续调用,以避免非法转换为该类。
或者,只需创建一个iostream &
引用并忘记原始stringstream
,但目的只是为了销毁它。