# 标准库头文件 <spanstream>

< cpp‎ | header

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

### 类
basic_spanbuf (C++23) | 实现原始固定字符缓冲区设备 (类模板)
basic_ispanstream (C++23) | 实现固定字符缓冲区输入操作 (类模板)
basic_ospanstream (C++23) | 实现固定字符缓冲区输出操作 (类模板)
basic_spanstream (C++23) | 实现固定字符缓冲区输入/输出操作 (类模板)
`spanbuf`(C++23) | std::basic_spanbuf<char> (typedef)
`wspanbuf`(C++23) | std::basic_spanbuf<wchar_t> (typedef)
`ispanstream`(C++23) | std::basic_ispanstream<char> (typedef)
`wispanstream`(C++23) | std::basic_ispanstream<wchar_t> (typedef)
`ospanstream`(C++23) | std::basic_ospanstream<char> (typedef)
`wospanstream`(C++23) | std::basic_ospanstream<wchar_t> (typedef)
`spanstream`(C++23) | std::basic_spanstream<char> (typedef)
`wspanstream`(C++23) | std::basic_spanstream<wchar_t> (typedef)
### 函数
std::swap(std::basic_spanbuf) (C++23) | 特化 std::swap 算法 (函数模板)
std::swap(std::basic_ispanstream) (C++23) | 特化 std::swap 算法 (函数模板)
std::swap(std::basic_ospanstream) (C++23) | 特化 std::swap 算法 (函数模板)
std::swap(std::basic_spanstream) (C++23) | 特化 std::swap 算法 (函数模板)

### 概要

    namespace std {
      template<class CharT, class Traits = char_traits<CharT>>
        class basic_spanbuf;

      using spanbuf = basic_spanbuf<char>;
      using wspanbuf = basic_spanbuf<wchar_t>;

      template<class CharT, class Traits = char_traits<CharT>>
        class basic_ispanstream;

      using ispanstream = basic_ispanstream<char>;
      using wispanstream = basic_ispanstream<wchar_t>;

      template<class CharT, class Traits = char_traits<CharT>>
        class basic_ospanstream;

      using ospanstream = basic_ospanstream<char>;
      using wospanstream = basic_ospanstream<wchar_t>;

      template<class CharT, class Traits = char_traits<CharT>>
        class basic_spanstream;

      using spanstream = basic_spanstream<char>;
      using wspanstream = basic_spanstream<wchar_t>;
    }

#### 类模板 std::basic_spanbuf

    namespace std {
      template<class CharT, class Traits = char_traits<CharT>>
      class basic_spanbuf
        : 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;

        // 构造函数
        basic_spanbuf() : basic_spanbuf(ios_base::in | ios_base::out) {}
        explicit basic_spanbuf(ios_base::openmode which)
          : basic_spanbuf(std::span<CharT>(), which) {}
        explicit basic_spanbuf(
          std::span<CharT> s,
          ios_base::openmode which = ios_base::in | ios_base::out);
        basic_spanbuf(const basic_spanbuf&) = delete;
        basic_spanbuf(basic_spanbuf&& rhs);

        // 赋值与交换
        basic_spanbuf& operator=(const basic_spanbuf&) = delete;
        basic_spanbuf& operator=(basic_spanbuf&& rhs);
        void swap(basic_spanbuf& rhs);

        // 获取与设置
        std::span<CharT> span() const noexcept;
        void span(std::span<CharT> s) noexcept;

      protected:
        // 重写的虚函数
        basic_streambuf<CharT, Traits>* setbuf(CharT*, streamsize) override;
        pos_type seekoff(off_type off, ios_base::seekdir way,
                         ios_base::openmode which
                           = ios_base::in | ios_base::out) override;
        pos_type seekpos(pos_type sp,
                         ios_base::openmode which
                           = ios_base::in | ios_base::out) override;

      private:
        ios_base::openmode mode; // 仅用于阐释
        std::span<CharT> buf; // 仅用于阐释
      };

      template<class CharT, class Traits>
        void swap(basic_spanbuf<CharT, Traits>& x,
                  basic_spanbuf<CharT, Traits>& y);
    }

#### 类模板 std::basic_ispanstream

    namespace std {
      template<class CharT, class Traits = char_traits<CharT>>
      class basic_ispanstream
        : public basic_istream<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;

        // 构造函数
        explicit basic_ispanstream(
          std::span<CharT> s,
          ios_base::openmode which = ios_base::in);
        basic_ispanstream(const basic_ispanstream&) = delete;
        basic_ispanstream(basic_ispanstream&& rhs);
        template<class ROS>
        explicit basic_ispanstream(ROS&& s);

        // 赋值与交换
        basic_ispanstream& operator=(const basic_ispanstream&) = delete;
        basic_ispanstream& operator=(basic_ispanstream&& rhs);
        void swap(basic_ispanstream& rhs);

        // 成员
        basic_spanbuf<CharT, Traits>* rdbuf() const noexcept;
        std::span<const CharT> span() const noexcept;
        void span(std::span<CharT> s) noexcept;
        template<class ROS>
        void span(ROS&& s) noexcept;

      private:
        basic_spanbuf<CharT, Traits> sb; // 仅用于阐释
      };

      template<class CharT, class Traits>
        void swap(basic_ispanstream<CharT, Traits>& x,
                  basic_ispanstream<CharT, Traits>& y);
    }

#### 类模板 std::basic_ospanstream

    namespace std {
      template<class CharT, class Traits = char_traits<CharT>>
      class basic_ospanstream
        : public basic_ostream<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;

        // 构造函数
        explicit basic_ospanstream(
          std::span<CharT> s,
          ios_base::openmode which = ios_base::out);
        basic_ospanstream(const basic_ospanstream&) = delete;
        basic_ospanstream(basic_ospanstream&& rhs);

        // 赋值与交换
        basic_ospanstream& operator=(const basic_ospanstream&) = delete;
        basic_ospanstream& operator=(basic_ospanstream&& rhs);
        void swap(basic_ospanstream& rhs);

        // 成员
        basic_spanbuf<CharT, Traits>* rdbuf() const noexcept;
        std::span<CharT> span() const noexcept;
        void span(std::span<CharT> s) noexcept;

      private:
        basic_spanbuf<CharT, Traits> sb; // 仅用于阐释
      };

      template<class CharT, class Traits>
        void swap(basic_ospanstream<CharT, Traits>& x,
                  basic_ospanstream<CharT, Traits>& y);
    }

#### 类模板 std::basic_spanstream

    namespace std {
      template<class CharT, class Traits = char_traits<CharT>>
      class basic_spanstream
        : public basic_iostream<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;

        // 构造函数
        explicit basic_spanstream(
          std::span<CharT> s,
          ios_base::openmode which = ios_base::out | ios_base::in);
        basic_spanstream(const basic_spanstream&) = delete;
         basic_spanstream(basic_spanstream&& rhs);

         // 赋值与交换
        basic_spanstream& operator=(const basic_spanstream&) = delete;
        basic_spanstream& operator=(basic_spanstream&& rhs);
        void swap(basic_spanstream& rhs);

        // 成员
        basic_spanbuf<CharT, Traits>* rdbuf() const noexcept;
        std::span<CharT> span() const noexcept;
        void span(std::span<CharT> s) noexcept;

      private:
        basic_spanbuf<CharT, Traits> sb; // 仅用于阐释
      };

      template<class CharT, class Traits>
        void swap(basic_spanstream<CharT, Traits>& x,
                  basic_spanstream<CharT, Traits>& y);
    }