gpt4 book ai didi

c++ - std::streambuf::overflow 的正确实现

转载 作者:搜寻专家 更新时间:2023-10-31 00:15:05 25 4
gpt4 key购买 nike

我正在创建一个特殊的 std::streambuf 和 std::ostream 实现。为此,我需要实现 std::streambuf::overflow功能。该函数 protected ,只能由 std::streambuf::sputc 调用和 std::streambuf::xsputn并且仅当缓冲区中没有更多空间时(即 pptr() == epptr() )。默认行为是返回 eof , 所以调用函数代替 sputc 显然是不正确的.

然而 std::stringbuf 的 GNU libc 实现并插入实现 boost::io::alt_stringbuf在 Boost.Format 中仍然检查是否 pptr() < epptr()在这种情况下,只需附加字符即可。在后一种情况下,甚至大胆地调用 sputc (因此依赖于如果缓冲区中仍有空间它不会调用 overflow 的事实)。

实现这个案例的原因是什么?

好吧,我不太明白另一种情况,overflow(eof()) , 任何一个。尽管明确指定,但它似乎并未在任何地方实际使用。

最佳答案

问题似乎是为什么实现检查 this->pptr() == this->epptr():简单的原因是进一步的派生类可能最终调用 protected 函数!当缓冲区中有空间时,标准 C++ 库永远不会调用 overflow()。有一段时间我还检查过 this->pptr() == this->epptr() 但我已经停止这样做了:隐含的契约是进一步的派生类不会做傻事东西。

提出的另一个问题是:用参数 traits_type::eof() 调用 overflow() 是什么意思?尽管我一直在处理这种情况,但这是标准 C++ 库中不会发生的另一种情况:目的是让 overflow() 刷新流。也就是说,sync() 只会调用 this->overflow(traits_type::eof())。在实践中,我发现从 overflow() 调用 sync() 可能在将字符存储到缓冲区之后(即 sync())更合理> woube 使用 pptr() == epptr() + 1 调用,当然,假设分配的缓冲区至少有一个字符的空间。

关于c++ - std::streambuf::overflow 的正确实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20667951/

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