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"版本是隐藏的(由于成员函数隐藏),因此无法通过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
,除非是为了销毁它
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法