是否可以更改 ostringstream rdbuf?

Is it possible to change ostringstream rdbuf?

本文关键字:ostringstream rdbuf 是否      更新时间:2023-10-16

我尝试以下代码:

ostringstream oss;
streambuf *psbuf, *backup;
backup = oss.rdbuf();     
psbuf = cout.rdbuf();        
oss.rdbuf(psbuf);        
oss << things << endl;
oss.rdbuf(backup);   

但不幸的是,我收到此错误:

error: too many arguments to function call, expected 0, have 1
oss.rdbuf(backup);   

但是 rdbuf 有两个重载:

获取 (1) basic_streambuf<char_type,traits_type>* RDBUF() 常量;

第(2)组 basic_streambuf<char_type,traits_type>* RDBUF (basic_streambuf<char_type,traits_type>* SB);

是的,我知道它说basic_streambuf但它实际上只是一个 typedeftypedef basic_streambuf<char> streambuf;,所以它应该可以工作。为什么它不起作用?

即使std::ostringstreamstd::basic_ios继承了rdbuf,但由于std::basic_ostream还定义了自己的名为rdbuf的成员函数,有效地隐藏了您正在寻找的重载,因此无法访问重载。

您可以通过将std::ostringstream实例强制转换为std::ostream引用来访问成员函数,如以下示例所示:

std::ostringstream oss;
std::ostream&      oss_ref = oss;
auto prev = oss_ref.rdbuf (std::cout.rdbuf ());
oss << "hello world"; // will print to the buffer of std::cout
oss_ref.rdbuf (prev); // reset

static_cast<std::ostream&> (oss).rdbuf (...) // equivalent

为什么std::basic_ostringstream定义自己的rdbuf

通常rdbuf返回一个std::basic_streambuf*,但std::ostringstream使用std::basic_stringbuf

由于不能基于返回类型进行过载,因此决定有效地隐藏以前的过载,以支持新的过载。

通过返回std::basic_stringbuf很容易看出std::ostringstream内部使用stringbuf,并且它还提供了对std::basic_stringbufstr函数(std::basic_streambuf中不存在的函数)的更容易访问

因为在类ostringstream(basic_ostringstream<char>的 typedef)中,只有rdbuf()的 gettor 版本被定义为其成员函数,所以从基类继承的 settor 版本被隐藏了。您可以通过将oss向上转换为基类(如ostream)来使用rdbuf()的 setor 版本。