我正在创建一个特殊的std :: streambuf和std :: ostream实现.为此,我需要实现该std::streambuf::overflow功能.该函数受保护,仅由std::streambuf::sputc和调用,std::streambuf::xsputn并且仅当缓冲区中没有空间时(即pptr() == epptr()).默认行为是返回eof,因此代替调用函数显然是不正确的sputc.
尽管如此std::stringbuf,boost::io::alt_stringbuf在Boost.Format中的GNU libc实现和boost实现仍然检查是否pptr() < epptr()和这样的情况只是追加该字符.在后一种情况下甚至大胆地通过调用sputc(因此依赖于overflow如果缓冲区中仍有空间它将不会调用的事实).
实施此案的原因是什么?
好吧,我也不太了解其他情况overflow(eof()).虽然明确指定,但它似乎并未在任何地方实际使用.
问题似乎是为什么实现检查是否this->pptr() == this->epptr():简单的原因是进一步的派生类可能最终调用该protected函数!overflow()当缓冲区中有空间时,标准C++库将永远不会调用.有一段时间我曾经也检查过this->pptr() == this->epptr()我是否已经停止这样做了:隐式契约是进一步派生类不做傻事.
提出的另一个问题是:overflow()用参数调用它意味着什么traits_type::eof()?虽然我一直在处理这种情况,但这是另一种情况,它不会发生在标准C++库中:意图是overflow()刷新流.也就是说,sync()只是打电话this->overflow(traits_type::eof()).在实践中,我发现它更合理调用sync()从overflow()可能存储字符到缓冲区后(即sync()woube调用pptr() == epptr() + 1其中当然,假设分配的缓冲区有空间至少还有一个字符).
| 归档时间: |
|
| 查看次数: |
1217 次 |
| 最近记录: |