2013-02-28 7 views
0

рассмотрении простого подсчета фильтр:в 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"; 

, что будет разница между вызовом синхронизации(), strict_sync() или заподлицо()? counted_cout.sync(); // что отличается от этого вызова counted_cout.strict_sync(); // этому вызову counted_cout.flush(); // к этому вызову?

Я использую бустер 1.50.0

ответ

3

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

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

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

Участник flush просто возвращает ссылку на поток, эффективно отбрасывая, был ли флеш успешным. , Не являющийся член flushhas it's own rules for what it returns depending on the input value

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

 Смежные вопросы

  • Нет связанных вопросов^_^