是否可以更改 ostringstream rdbuf?
Is it possible to change ostringstream rdbuf?
我尝试以下代码:
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::ostringstream
从std::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_stringbuf
的str
函数(std::basic_streambuf
中不存在的函数)的更容易访问
因为在类ostringstream
(basic_ostringstream<char>
的 typedef)中,只有rdbuf()
的 gettor 版本被定义为其成员函数,所以从基类继承的 settor 版本被隐藏了。您可以通过将oss
向上转换为基类(如ostream
)来使用rdbuf()
的 setor 版本。
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 为什么缓冲区的内容在读取空 rdbuf 时被删除?
- 如何在C++中编写 ostream 的向量,它接收所有不同的输出流,如 cout、ostringstream 和 ofs
- 如何将字符串类型转换为 ostringstream
- 打印出ostringstream缓冲区
- rdbuf()->str()在哪里?
- 从ostringstream获取最长行的字符数的智能方法
- 将双精度的科学记数法附加到 ostringstream 时如何关闭它?
- 为什么cin.rdbuf()->sbumpc()在循环中只要求我输入一次?
- 使用 C++ fmtlib,有没有比使用 std::ostringstream 更干净的方法来将数据序列附加到字符串中
- 将C弦发送到非效果STD :: OSTRINGSTREAM怪异行为
- 当我使用fs.rdbuf()复制文件时,我会丢失一些数据
- 为什么简单地使用 ostringstream 会生成如此多的汇编代码
- C++ ostringstream.str().c_str()
- 如何使用OSTRINGSTREAM将C 中的十六进制字符串记录
- 什么目的地<<源.rdbuf();在做什么?为什么太多的开盘关闭
- 任何无需复制即可从 std::ostringstream 获取 std::string_view 的方法
- std::ostringstream将标志放在错误的位置
- 是否可以更改 ostringstream rdbuf?