std::stringstream类和rdbuf()成员函数

The std::stringstream class and rdbuf() member function

本文关键字:成员 函数 rdbuf stringstream 类和 std      更新时间:2023-10-16

basic_iostream类模板包括rdbuf()的两个重载-一个是const成员函数,它返回一个指向正在使用的内部streambuf的指针,另一个采用单个streambuf*参数,设置内部指针

但是,std::stringstream过载rdbuf()功能如下:

  stringbuf_type* rdbuf() const;

由于只有"getter"版本被重载,因此采用streambuf*参数的"setter"版本是隐藏的(由于成员函数隐藏),因此无法通过stringstream实例访问。

这样做有什么原因吗?是否可以更改字符串流使用的内部streambuf对象?这似乎在某些情况下是可取的,例如,您希望使用一个将所有输入转换为小写的字符串流对象。在这种情况下,从std::stringbuf派生的自定义stringbuf类将是理想的。但是,如果没有rdbuf(streambuf*)函数,就无法更改stringstream使用的内部streambuf对象。

那么,为什么std::stringstream不提供一种设置所使用的内部stringbuf对象的方法呢?

注意:为了避免混淆,我不是在谈论设置字符串流的内部内存缓冲区,而是专门谈论设置所使用的内部std::basic_stringbuf对象。

这样做有什么原因吗?

由于访问streambuf比更改它更常见,因此这种情况变得更方便。

除非缓冲区是streambuf,否则stringstream添加的特殊函数将不起作用,因此将其视为具有不同缓冲区的stringstream是没有意义的。不过,您可以使用整个基本iostream类接口。

是否可以更改字符串流使用的内部streambuf对象?

当然,只需限定成员访问权限:s.iostream::rdbuf( newbuf )。如果缓冲区不是std::stringbuf,则应该类似地限定对rdbuf()访问器的任何后续调用,以避免对该类的非法强制转换。

或者,只需创建一个iostream &引用并忘记原始stringstream,除非是为了销毁它