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() の呼び出しの違いは何ですか? count_cout.sync(); // この呼び出しとの違いはcounted_cout.strict_sync(); // この呼び出しへ count_cout.flush(); // この呼び出しに?

ブースト1.50.0を使用しています

4

1 に答える 1

4

syncstrict_sync、およびの主な違いflushは、戻り値です。それらの 3 つすべて。それらはすべて、 Flushableの概念filtering_streamを満たすの一部である Filter または Device で flush メソッドを呼び出します。Flushable の概念をサポートしないフィルター/デバイスは、単純にスキップされます。

syncFlushable Filters/Devices のいずれかが false を返さない限り、true を返します。これは、 の一部であるフラッシュ可能でないフィルタ/デバイスがある場合filtering_stream、データがそれらにスタックする可能性がありますが、syncそれらはフラッシュ可能ではないため、true を返すことを意味します。

strict_syncフラッシュ不可能なフィルター/デバイスに遭遇した場合を除いて、同様です。この場合、strict_syncFlushable Filters/Devices のすべてが true を返す場合でも、false を返します。strict_syncこれは、 true が返された場合、すべてのデータが正常にフラッシュされたことを呼び出し元が認識できるようにするためです。

メンバーflushは単にストリームへの参照を返し、フラッシュが成功したかどうかを効果的に破棄します。非メンバーflush には、入力値に応じて返されるものに関する独自のルールがあります

あなたの場合、CountableOstreamFilterはフラッシュ可能ではありません(必要なflushable_tagに変換できません)。したがって、 への呼び出しはsync、基になるストリームのフラッシュが成功する限り true を返します。ただし、strict_syncfalse を返す必要があります。

于 2013-02-28T19:59:57.220 に答える