【问题标题】:Custom stream flush type自定义流刷新类型
【发布时间】:2011-05-23 23:49:46
【问题描述】:

我对流和东西的问题有很多疑问,但经过思考后,我得出的结论是,我所需要的只是一个自定义刷新类型。我希望我的流在换行时刷新。它省去了输入 std::endl 的麻烦。有可能实现这一点吗?我正在使用带有自定义 stringbuf 的 ostream。

【问题讨论】:

  • 请原谅,但是为什么输入endl 比从(几乎)从头开始编写新流要困难几倍?
  • 这并不是出于对可能的兴趣,如果可能的话,如何。

标签: c++ flush ostream endl


【解决方案1】:

我相信只需要覆盖ostream::put(char),但不要引用我的话:

template <typename Ch>
class autoflush_ostream : public basic_ostream<Ch> {
public:
    typedef basic_ostream<Ch> Base;
    autoflush_ostream& put(Ch c);
};

template <typename Ch>
autoflush_ostream<Ch>& autoflush_ostream<Ch>::put(Ch c) {
    Base::put(c);
    if (c == "\n") {
        flush();
    }
    return *this;
}

您可能必须重写每个采用 STL 中定义的字符或字符序列的方法和函数。它们基本上都会做同样的事情:调用超类上定义的方法/函数,检查是否刚刚打印了换行符,如果是则刷新。

【讨论】:

  • basic_ostream::put 不是虚拟的,因此除非对象的静态类型是 autoflush_ostream(即 autoflush_ostream 对象、引用或指针),否则不会使用派生类的版本。特别是,这意味着stream &lt;&lt; '\n' 不能调用你的看跌期权。
  • 教我选择编程而不是睡眠。
猜你喜欢
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多