最終更新日時(UTC):
が更新

履歴 編集

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

メンバ型

名前 説明 対応バージョン
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, size_t num_args = 0) noexcept
      :begin_(fmt.begin())
      ,end_(fmt.end())
      ,num_args_(num_args)
    {}

    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");
      }
    }
  };
}

バージョン

言語

  • C++20

処理系

参照