в boost iostream filtering_ostream, в чем разница между sync (), strict_sync () и flush ()?

учитывая простой фильтр подсчета:

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 (); // на этот звонок?

Я использую Boost 1.50.0

1

Решение

Ключевая разница между sync, strict_sync, а также flush это их возвращаемые значения. Все 3 из них. Все они вызывают метод сброса на любом фильтре или устройстве, которое является частью filtering_stream это удовлетворяет Смываемый концепция. Любой фильтр / устройство, которое не поддерживает концепцию Flushable, просто пропускается.

sync возвращает true, если один из Flushable Filters / Devices не возвращает false. Это означает, что если существуют нерасщепляемые фильтры / устройства, которые являются частью filtering_stream, данные могут застрять в них, но sync вернул бы true, так как они не Flushable.

strict_sync аналогично, за исключением случаев, когда он встречает нерасширяемый фильтр / устройство. В этом случае, strict_sync вернет false, даже если все Flushable Filters / Devices могут вернуть true. Причина в том, что вызывающий strict_sync знает, что если он возвращает true, все данные были успешно сброшены.

Член flush просто возвращает ссылку на поток, фактически отбрасывая, была ли очистка успешной. Не член flush имеет свои собственные правила для того, что он возвращает в зависимости от входного значения

В вашем случае CountableOstreamFilter не является Flushable (он не конвертируется в необходимый flushable_tag). Следовательно, призывы к sync вернет true до тех пор, пока очистка основного потока будет успешной. Тем не мение, strict_sync должен вернуть false.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]