2013-12-18 36 views
1

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

不过的std::stringbuf都GNU libc实现,并推动实施中Boost.Format库boost::io::alt_stringbuf还检查是否pptr() < epptr()和这种情况下简单地追加字符。在后一种情况下,即使通过拨打sputc(因此依靠它不会在缓冲区中仍有空间的情况下不会调用overflow)这一事实,也会大胆。

执行此案的原因是什么?

好吧,我不太了解其他情况下,overflow(eof()),要么。尽管它明确指定,但似乎并未在任何地方实际使用。

回答

5

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

提出的另一个问题是:overflow()用参数traits_type::eof()调用是什么意思?虽然我继续处理这种情况,但它是另一种情况,不会发生在标准C++库中:意图是让overflow()刷新流。也就是说,sync()只会叫this->overflow(traits_type::eof())。实际上,我发现在将字符存入缓冲区之后(即sync()pptr() == epptr() + 1调用,当然,假定分配的缓冲区至少有一个以上字符的空间)之后,可以从overflow()调用sync()更合理。