1

考虑一个简单的计数过滤器:

class CountableOstreamFilter : public boost::iostreams::multichar_output_filter {
public:
    CountableOstreamFilter(): m_written(0) { 
    }

    template<typename Sink>
    std::streamsize write(Sink& dest, const char* s, std::streamsize n)
    {
            auto result  = boost::iostreams::write(dest, s, n);
            assert(n == result);
            m_written += result;
            return result;
    }

    inline std::streamsize writtenBytes() const {
        return m_written;
    }

private:
    std::streamsize m_written;
};

并因此使用它:

boost::iostreams::filtering_ostream counted_cout;
counted_cout.push(CountableOstreamFilter());
counted_cout.push(std::cout);
counted_cout << "hello world";

调用sync()、strict_sync() 或flush() 有什么区别?counted_cout.sync(); // 与此调用有何不同 counted_cout.strict_sync(); // 到这个调用 counted_cout.flush(); // 这个电话?

我正在使用提升 1.50.0

4

1 回答 1

4

syncstrict_sync和之间的主要区别在于flush它们的返回值。他们三个。filtering_stream它们都在满足Flushable概念的任何过滤器或设备上调用 flush 方法。任何不支持 Flushable 概念的过滤器/设备都会被跳过。

sync除非可冲洗过滤器/设备之一返回 false,否则返回 true。这意味着如果存在属于 的一部分的不可刷新的过滤器/设备filtering_stream,数据可能会卡在其中,但sync会返回 true,因为它们不是可刷新的。

strict_sync类似,除非遇到不可冲洗的过滤器/设备。在这种情况下,strict_sync即使所有可冲洗过滤器/设备都可能返回 true,也会返回 false。这样做的原因是调用者strict_sync知道如果它返回 true,则所有数据都已成功刷新。

该成员flush简单地返回对流的引用,有效地丢弃刷新是否成功。非成员flush 根据输入值对返回的内容有自己的规则

在您的情况下,CountableOstreamFilter不是 Flushable (它不能转换为必要的 flushable_tag)。sync因此,只要底层流上的刷新成功,调用就会返回 true。但是,strict_sync应该返回 false。

于 2013-02-28T19:59:57.220 回答