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

时间:2015-04-04 23:35:27

标签: c++

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

1 个答案:

答案 0 :(得分:2)

  

有没有理由这样做?

由于访问streambuf比更改它更常见,因此更方便。

除非缓冲区是stringstream,否则streambuf添加的特殊功能将无效,因此将其视为具有不同缓冲区的stringstream并不合理。但是,您可以使用整个基本iostream类接口。

  

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

当然,只需限定会员访问权限:s.iostream::rdbuf( newbuf )。如果缓冲区不是rdbuf(),您应该同样限定对std::stringbuf访问者的任何后续调用,以避免非法转换为该类。

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