首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确实现std::streambuf::溢出

正确实现std::streambuf::溢出
EN

Stack Overflow用户
提问于 2013-12-18 20:41:19
回答 1查看 1.8K关注 0票数 2

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

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

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

好吧,我也不太明白另一种情况,overflow(eof())。虽然它是显式指定的,但似乎并没有在任何地方实际使用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-26 22:56:16

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20667951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档