# 标准库头文件 <syncstream>

< cpp‎ | header

此头文件是输入/输出库的一部分。

### 包含
<ostream> (C++20) | std::basic_ostream 、 std::basic_iostream 类模板与数个 typedef
### 类
basic_syncbuf (C++20) | 同步输出设备的包装 (类模板)
basic_osyncstream (C++20) | 同步输出流的包装 (类模板)
`syncbuf`(C++20) | std::basic_syncbuf<char> (typedef)
`wsyncbuf`(C++20) | std::basic_syncbuf<wchar_t> (typedef)
`osyncstream`(C++20) | std::basic_osyncstream<char> (typedef)
`wosyncstream`(C++20) | std::basic_osyncstream<wchar_t> (typedef)
### 函数
std::swap(std::basic_syncbuf) (C++20) | 特化 std::swap 算法 (函数模板)

### 概要

    #include <ostream>

    namespace std {
      template<class CharT, class Traits = char_traits<CharT>,
               class Allocator = allocator<CharT>>
        class basic_syncbuf;

      using syncbuf = basic_syncbuf<char>;
      using wsyncbuf = basic_syncbuf<wchar_t>;

      template<class CharT, class Traits = char_traits<CharT>,
               class Allocator = allocator<CharT>>
        class basic_osyncstream;

      using osyncstream = basic_osyncstream<char>;
      using wosyncstream = basic_osyncstream<wchar_t>;
    }

#### 类模板 std::basic_syncbuf

    namespace std {
      template<class CharT, class Traits = char_traits<CharT>,
               class Allocator = allocator<CharT>>
      class basic_syncbuf : public basic_streambuf<CharT, Traits> {
      public:
        using char_type      = CharT;
        using int_type       = typename Traits::int_type;
        using pos_type       = typename Traits::pos_type;
        using off_type       = typename Traits::off_type;
        using traits_type    = Traits;
        using allocator_type = Allocator;

        using streambuf_type = basic_streambuf<CharT, Traits>;

        // 构造与析构
        basic_syncbuf()
          : basic_syncbuf(nullptr) {}
        explicit basic_syncbuf(streambuf_type* obuf)
          : basic_syncbuf(obuf, Allocator()) {}
        basic_syncbuf(streambuf_type*, const Allocator&);
        basic_syncbuf(basic_syncbuf&&);
        ~basic_syncbuf();

        // 赋值与交换
        basic_syncbuf& operator=(basic_syncbuf&&);
        void swap(basic_syncbuf&);

        // 成员函数
        bool emit();
        streambuf_type* get_wrapped() const noexcept;
        allocator_type get_allocator() const noexcept;
        void set_emit_on_sync(bool) noexcept;

      protected:
        // 覆盖的虚函数
        int sync() override;

      private:
        streambuf_type* wrapped;    // 仅用于阐释
        bool emit_on_sync{};        // 仅用于阐释
      };

      // 特化的算法
      template<class CharT, class Traits, class Allocator>
        void swap(basic_syncbuf<CharT, Traits, Allocator>&,
                  basic_syncbuf<CharT, Traits, Allocator>&);
    }

#### 类模板 std::basic_osyncstream

    namespace std {
      template<class CharT, class Traits = char_traits<CharT>,
               class Allocator = allocator<CharT>>
      class basic_syncbuf : public basic_streambuf<CharT, Traits> {
      public:
        using char_type      = CharT;
        using int_type       = typename Traits::int_type;
        using pos_type       = typename Traits::pos_type;
        using off_type       = typename Traits::off_type;
        using traits_type    = Traits;
        using allocator_type = Allocator;

        using streambuf_type = basic_streambuf<CharT, Traits>;

        // 构造与析构
        basic_syncbuf()
          : basic_syncbuf(nullptr) {}
        explicit basic_syncbuf(streambuf_type* obuf)
          : basic_syncbuf(obuf, Allocator()) {}
        basic_syncbuf(streambuf_type*, const Allocator&);
        basic_syncbuf(basic_syncbuf&&);
        ~basic_syncbuf();

        // 赋值与交换
        basic_syncbuf& operator=(basic_syncbuf&&);
        void swap(basic_syncbuf&);

        // 成员函数
        bool emit();
        streambuf_type* get_wrapped() const noexcept;
        allocator_type get_allocator() const noexcept;
        void set_emit_on_sync(bool) noexcept;

      protected:
        // 覆盖的虚函数
        int sync() override;

      private:
        streambuf_type* wrapped;    // 仅用于阐释
        bool emit_on_sync{};        // 仅用于阐释
      };

      // 特化的算法
      template<class CharT, class Traits, class Allocator>
        void swap(basic_syncbuf<CharT, Traits, Allocator>&,
                  basic_syncbuf<CharT, Traits, Allocator>&);
    }