最終更新日時: 2026年02月27日 12時03分43秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<format>

# std::basic_format_parse_context(C++20)

    namespace std {
      template<class charT>
      class basic_format_parse_context; // (1)

      using format_parse_context = basic_format_parse_context<char>; // (2)
      using wformat_parse_context = basic_format_parse_context<wchar_t>; // (3)
    }

## 概要

書式文字列の解析中の状態を保持するクラス。

- (2): マルチバイト文字列版
- (3): ワイド文字列版

このクラスのオブジェクトはコピーできない。

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++20
`begin` | 書式文字列の先頭を指すイテレータを取得する | C++20
`end` | 書式文字列の末尾を指すイテレータを取得する | C++20
`advance_to` | 指定したイテレータを先頭イテレータとして設定する | C++20
`next_arg_id` | フォーマット引数の番号を次に進める | C++20
`check_arg_id` | フォーマット引数の番号指定が有効か確かめる | C++20
`check_dynamic_spec` | 動的な幅・精度の引数の型を検証する | C++26
`check_dynamic_spec_integral` | 動的な幅・精度の引数の型が整数型か検証する | C++26
`check_dynamic_spec_string` | 動的な幅・精度の引数の型が文字列型か検証する | C++26

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`char_type` | 文字の型(`charT`と等しい) (type-alias) | C++20
`const_iterator` | 書式文字列のイテレータの型(`basic_string_view<charT>::const_iterator`と等しい) (type-alias) | C++20
`iterator` | 書式文字列のイテレータの型(`basic_string_view<charT>::iterator`と等しい) (type-alias) | C++20

## 実装例

    namespace std {
      template<class charT>
      class basic_format_parse_context {
      public:
        using char_type = charT;
        using const_iterator = typename basic_string_view<charT>::const_iterator;
        using iterator = const_iterator;

      private:
        iterator begin_;
        iterator end_;
        enum indexing { unknown, manual, automatic };
        indexing indexing_ = unknown;
        size_t next_arg_id_ = 0;
        size_t num_args_;

      public:
        explicit constexpr basic_format_parse_context(basic_string_view<charT> fmt) noexcept
          :begin_(fmt.begin())
          ,end_(fmt.end())
          ,num_args_(0)
        {}

        basic_format_parse_context(const basic_format_parse_context&) = delete;
        basic_format_parse_context& operator=(const basic_format_parse_context&) = delete;

        constexpr const_iterator begin() const noexcept
        {
          return begin_;
        }

        constexpr const_iterator end() const noexcept
        {
          return end_;
        }

        constexpr void advance_to(const_iterator it)
        {
          begin_ = it;
        }

        constexpr size_t next_arg_id()
        {
          if (indexing_ != manual) {
            if (indexing_ == unknown) {
              indexing_ = automatic;
            }
            return next_arg_id_++;
          } else {
            throw format_error("mixing of automatic and manual argument indexing");
          }
        }

        constexpr void check_arg_id(size_t id)
        {
          if (indexing_ != automatic) {
            if (indexing_ == unknown) {
              indexing_ = manual;
            }
          } else {
            throw format_error("mixing of automatic and manual argument indexing");
          }
        }

        template<class... Ts>
        constexpr void check_dynamic_spec(size_t id) noexcept;

        constexpr void check_dynamic_spec_integral(size_t id) noexcept
        {
          check_dynamic_spec<int, unsigned int, long long int, unsigned long long int>(id);
        }

        constexpr void check_dynamic_spec_string(size_t id) noexcept
        {
          check_dynamic_spec<const char_type*, basic_string_view<char_type>>(id);
        }
      };
    }

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 参照

- P0645R10 Text Formatting
- P2757R3 Type-checking format args