2015-04-04 95 views
1

basic_iostream类模板包括两个重载rdbuf() - 一个是const成员函数返回一个指针,指向内部流缓冲在使用中,其它采用单个streambuf*说法,和设置的内部指针。在std :: stringstream的类和rdbuf()成员函数

然而,std::stringstream过载rdbuf()功能如下:

stringbuf_type* rdbuf() const; 

由于只有“吸气剂”的版本过载,则“设置器”版本,它需要一个streambuf*参数是隐藏的(由于member function hiding),和因此无法通过stringstream实例访问。

这是否有一些原因?是否有可能更改stringstream使用的内部对象streambuf?看起来在某些情况下这可能是可取的,例如,您想要使用将所有输入转换为小写字符串的stringstream对象。在这种情况下,从std::stringbuf派生的自定义stringbuf类将是理想的。但是,如果没有rdbuf(streambuf*)函数,则无法更改stringstream使用的内部streambuf对象。

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

:为了避免混淆,我谈论设置字符串流的内部存储器缓冲器,而我说的是具体地约设置使用的内部std::basic_stringbuf对象。

回答

2

这是否有一些原因?

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

通过stringstream添加的特殊功能将无法正常工作,除非缓冲是streambuf,所以它并没有真正意义的把它当作一个不同的缓冲区stringstream。不过,您可以使用整个基类iostream类接口。

是否可以更改stringstream使用的内部对象streambuf

当然,只是有资格成员访问:s.iostream::rdbuf(newbuf)。如果缓冲区不是std::stringbuf,您应该类似地限制对rdbuf()访问者的任何后续调用,以避免非法转换到该类别。

或者,只是创建一个iostream &参考,并忘记原来的stringstream,除了破坏它的目的。

+0

你说“因为访问'streambuf'比改变它更常见,所以这种情况变得更加方便了。”但...为什么'std :: stringstream'只有第二个覆盖:'stringbuf * stringstream :: rdbuf(stringbuf * sb);'? – Siler 2015-04-04 23:47:26

+0

@Siler'filebuf'具有等价的重载,所以我猜他们并不真的希望你通过拥有缓冲区的接口交换缓冲区。说实话有点难以理解。通常适合创建一个新的基类对象。 – Potatoswatter 2015-04-04 23:50:31

相关问题