gpt4 book ai didi

c++ - 是否可以更改 ostringstream rdbuf?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:19 27 4
gpt4 key购买 nike

我试试下面的代码:

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 有两个重载:

get (1) basic_streambuf<char_type,traits_type>* rdbuf() const;

set (2) basic_streambuf<char_type,traits_type>* rdbuf (basic_streambuf<char_type,traits_type>* sb);

是的,我知道它说 basic_streambuf但它真的只是一个 typedef typedef 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 中不存在的函数)。

关于c++ - 是否可以更改 ostringstream rdbuf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22243248/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com