Namespaces
Variants

Standard library header <format> (C++20)

From cppreference.net
Standard library headers

このヘッダは テキスト処理 ライブラリの一部です。

目次

コンセプト

型がフォーマット可能であること、すなわち std::formatter を特殊化し、メンバー関数 parse および format を提供することを指定する
(コンセプト)

列挙型

範囲のフォーマット方法を指定する
(enum)

クラス

(C++20)
指定された型のフォーマット規則を定義する
(クラステンプレート)
範囲型の std::formatter 特殊化を実装するためのクラステンプレート
(クラステンプレート)
フォーマット文字列パーサーの状態
(クラステンプレート)
書式設定状態、すべての書式設定引数と出力イテレータを含む
(クラステンプレート)
ユーザー定義フォーマッタのための書式設定引数へのアクセスを提供するクラステンプレート
(クラステンプレート)
すべてのフォーマット引数へのアクセスを提供するクラス
(クラステンプレート)
構築時にコンパイル時フォーマット文字列チェックを実行するクラステンプレート
(クラステンプレート)
フォーマットエラー時にスローされる例外型
(クラス)
Formatter特殊化
pair および tuple の フォーマット対応
(クラステンプレートの特殊化)
範囲のフォーマットサポート
(クラステンプレートの特殊化)

関数

(C++20)
引数のフォーマットされた表現を新しい文字列に格納する
(関数テンプレート)
(C++20)
出力イテレータを通して引数のフォーマットされた表現を書き出す
(関数テンプレート)
出力イテレータを通して引数のフォーマットされた表現を書き出し、指定されたサイズを超えない
(関数テンプレート)
その引数のフォーマットされた表現を格納するために必要な文字数を決定する
(関数テンプレート)
ユーザー向け書式設定関数で直接使用可能なランタイム書式文字列を作成する
(関数)
(C++20)
型消去された引数表現を使用する std::format の非テンプレート版
(関数)
(C++20)
型消去された引数表現を使用する std::format_to の非テンプレート版
(関数テンプレート)
(C++20) (deprecated in C++26)
ユーザー定義フォーマッタのための引数ビジットインターフェース
(関数テンプレート)
すべてのフォーマット引数を参照する型消去オブジェクトを作成し、 format_args に変換可能にする
(関数テンプレート)

ヘルパー

範囲に適した std::range_format を選択する
(変数テンプレート)
引数の型が効率的に出力できることを示す
(variable template)

概要

namespace std {
  // クラステンプレート basic_format_context
  template<class Out, class CharT> class basic_format_context;
  using format_context = basic_format_context</* 未指定 */, char>;
  using wformat_context = basic_format_context</* 未指定 */, wchar_t>;
  // クラステンプレート basic_format_args
  template<class Context> class basic_format_args;
  using format_args = basic_format_args<format_context>;
  using wformat_args = basic_format_args<wformat_context>;
  // クラステンプレート basic_format_string
  template<class CharT, class... Args> struct basic_format_string;
  template<class CharT> struct /*ランタイムフォーマット文字列*/
  {                                   // 説明専用
  private:
    basic_string_view<CharT> /*文字列*/; // 説明専用
  public:
    /*ランタイムフォーマット文字列*/(basic_string_view<CharT> s) noexcept
      : /*文字列*/(s)
    {
    }
    /*ランタイムフォーマット文字列*/(const /*ランタイムフォーマット文字列*/&) = delete;
    /*ランタイムフォーマット文字列*/& operator=(const /*ランタイムフォーマット文字列*/&) = delete;
  };
  /*ランタイムフォーマット文字列*/<char> runtime_format(string_view fmt) noexcept { return fmt; }
  /*ランタイムフォーマット文字列*/<wchar_t> runtime_format(wstring_view fmt) noexcept
  {
    return fmt;
  }
  template<class... Args>
  using format_string = basic_format_string<char, type_identity_t<Args>...>;
  template<class... Args>
  using wformat_string = basic_format_string<wchar_t, type_identity_t<Args>...>;
  // フォーマット関数
  template<class... Args> string format(format_string<Args...> fmt, Args&&... args);
  template<class... Args> wstring format(wformat_string<Args...> fmt, Args&&... args);
  template<class... Args>
  string format(const locale& loc, format_string<Args...> fmt, Args&&... args);
  template<class... Args>
  wstring format(const locale& loc, wformat_string<Args...> fmt, Args&&... args);
  string vformat(string_view fmt, format_args args);
  wstring vformat(wstring_view fmt, wformat_args args);
  string vformat(const locale& loc, string_view fmt, format_args args);
  wstring vformat(const locale& loc, wstring_view fmt, wformat_args args);
  template<class Out, class... Args>
  Out format_to(Out out, format_string<Args...> fmt, Args&&... args);
  template<class Out, class... Args>
  Out format_to(Out out, wformat_string<Args...> fmt, Args&&... args);
  template<class Out, class... Args>
  Out format_to(Out out, const locale& loc, format_string<Args...> fmt, Args&&... args);
  template<class Out, class... Args>
  Out format_to(Out out, const locale& loc, wformat_string<Args...> fmt, Args&&... args);
  template<class Out> Out vformat_to(Out out, string_view fmt, format_args args);
  template<class Out> Out vformat_to(Out out, wstring_view fmt, wformat_args args);
  template<class Out>
  Out vformat_to(Out out, const locale& loc, string_view fmt, format_args args);
  template<class Out>
  Out vformat_to(Out out, const locale& loc, wstring_view fmt, wformat_args args);
  template<class Out> struct format_to_n_result
  {
    Out out;
    iter_difference_t<Out> size;
  };
  template<class Out, class... Args>
  format_to_n_result<Out> format_to_n(Out out,
                                      iter_difference_t<Out> n,
                                      format_string<Args...> fmt,
                                      Args&&... args);
  template<class Out, class... Args>
  format_to_n_result<Out> format_to_n(Out out,
                                      iter_difference_t<Out> n,
                                      wformat_string<Args...> fmt,
                                      Args&&... args);
  template<class Out, class... Args>
  format_to_n_result<Out> format_to_n(Out out,
                                      iter_difference_t<Out> n,
                                      const locale& loc,
                                      format_string<Args...> fmt,
                                      Args&&... args);
  template<class Out, class... Args>
  format_to_n_result<Out> format_to_n(Out out,
                                      iter_difference_t<Out> n,
                                      const locale& loc,
                                      wformat_string<Args...> fmt,
                                      Args&&... args);
  template<class... Args>
  size_t formatted_size(format_string<Args...> fmt, Args&&... args);
  template<class... Args>
  size_t formatted_size(wformat_string<Args...> fmt, Args&&... args);
  template<class... Args>
  size_t formatted_size(const locale& loc, format_string<Args...> fmt, Args&&... args);
  template<class... Args>
  size_t formatted_size(const locale& loc, wformat_string<Args...> fmt, Args&&... args);
  // フォーマッタ
  template<class T, class CharT = char> struct formatter;
  // フォーマッタのロック
  template<class T> constexpr bool enable_nonlocking_formatter_optimization = false;
  // concept formattable
  template<class T, class CharT>
  concept formattable = /* 説明を参照 */;
  template<class R, class CharT>
  concept /*const-formattable-range*/ = // 説明専用
    ranges::input_range
(注:HTMLタグ・属性、タグ内のテキスト、C++固有の用語は翻訳対象外のため、元のまま保持されています)<const R> &&
    formattable<ranges::range_reference_t<const R>, CharT>;
  template<class R, class CharT>
  using /*fmt-maybe-const*/ =           // 説明専用
    conditional_t</*const-formattable-range*/<R, CharT>, const R, R>;
  // クラステンプレート basic_format_parse_context
  template<class CharT> class basic_format_parse_context;
  using format_parse_context = basic_format_parse_context<char>;
  using wformat_parse_context = basic_format_parse_context<wchar_t>;
  // 範囲のフォーマット
  // 変数テンプレート format_kind
  enum class range_format
  {
    disabled,
    map,
    set,
    sequence,
    string,
    debug_string
  };
  template<class R> constexpr /* 未指定 */ format_kind = /* 未指定 */;
  template<ranges::input_range
(注:指定された条件により、HTMLタグ・属性は翻訳せず、C++専門用語も翻訳対象外のため、元のテキストを保持しています) R>
    requires same_as<R, remove_cvref_t<R>>
  constexpr range_format format_kind<R> = /* 詳細は説明を参照 */;
  // クラステンプレート range_formatter
  template<class T, class CharT = char>
    requires same_as<remove_cvref_t<T>, T> && formattable<T, CharT>
  class range_formatter;
  // クラステンプレート range-default-formatter
  template<range_format K, ranges::input_range R, class CharT>
  struct /*range-default-formatter*/; // 説明専用
  // マップ、セット、文字列の特殊化
  template<ranges::input_range
(注:指定された条件により、HTMLタグ・属性は保持され、C++固有用語は翻訳されていません) R, class CharT>
    requires(format_kind<R> != range_format::無効) &&
            formattable<ranges::range_reference_t<R>, CharT>
  struct formatter<R, CharT> : /*range-default-formatter*/<format_kind<R>, R, CharT>
  {};
  template<ranges::input_range
(注:指示に従い、HTMLタグ・属性は翻訳せず、C++固有用語も翻訳していません) R>
    requires(format_kind<R> != range_format::無効)
  constexpr bool enable_nonlocking_formatter_optimization<R> = false;
  // arguments
  // クラステンプレート basic_format_arg
  template<class Context> class basic_format_arg;
  // クラステンプレート format-arg-store
  template<class Context, class... Args> class /*format-arg-store*/; // 説明専用
  template<class Context = format_context, class... Args>
  /*format-arg-store*/<Context, Args...> make_format_args(Args&... fmt_args);
  template<class... Args>
  /*format-arg-store*/<wformat_context, Args...> make_wformat_args(Args&... args);
  // class format_error
  class format_error;
}

クラステンプレート std::basic_format_string

namespace std {
  template<class CharT, class... Args> struct basic_format_string
  {
  private:
    basic_string_view<CharT> /*str*/; // 説明専用
  public:
    template<class T> consteval basic_format_string(const T& s);
    basic_format_string(/*runtime-format-string*/<CharT> s) noexcept
      : str(s./*str*/)
    {
    }
    constexpr basic_string_view<CharT> get() const noexcept { return /*str*/; }
  };
}

コンセプト std::formattable

template<class T, class CharT>
  concept formattable =
    semiregular<formatter<remove_cvref_t<T>, CharT>> &&
    requires(formatter<remove_cvref_t<T>, CharT> f,
             const formatter<remove_cvref_t<T>, CharT> cf,
             T t,
             basic_format_context<__fmt_iter_for<CharT>, CharT> fc,
             basic_format_parse_context<CharT> pc) {
        { f.parse(pc) } -> same_as<basic_format_parse_context<CharT>::iterator>;
        { cf.format(t, fc) } -> same_as<__fmt_iter_for<CharT>>;
    };

クラステンプレート std::basic_format_parse_context

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_;  // 説明専用
    size_t next_arg_id_; // 説明専用
    size_t num_args_;    // 説明専用
  public:
    constexpr explicit basic_format_parse_context(basic_string_view<CharT> fmt) noexcept;
    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;
    constexpr const_iterator end() const noexcept;
    constexpr void advance_to(const_iterator it);
    constexpr size_t next_arg_id();
    constexpr void check_arg_id(size_t id);
    template<class... Ts> constexpr void check_dynamic_spec(size_t id) noexcept;
    constexpr void check_dynamic_spec_integral(size_t id) noexcept;
    constexpr void check_dynamic_spec_string(size_t id) noexcept;
  };
}

クラステンプレート std::basic_format_context

namespace std {
  template<class Out, class CharT> class basic_format_context
  {
    basic_format_args<basic_format_context> args_; // 説明専用
    Out out_;                                      // 説明専用
    basic_format_context(const basic_format_context&) = delete;
    basic_format_context& operator=(const basic_format_context&) = delete;
  public:
    using iterator = Out;
    using char_type = CharT;
    template<class T> using formatter_type = formatter<T, CharT>;
    basic_format_arg<basic_format_context> arg(size_t id) const noexcept;
    std::locale locale();
    iterator out();
    void advance_to(iterator it);
  };
}

変数テンプレート std::format_kind

template<ranges::input_range R>
  requires same_as<R, remove_cvref_t<R>>
constexpr range_format format_kind<R> = /* 詳細は説明を参照 */;

クラステンプレート std::range_formatter

namespace std {
  template<class T, class CharT = char>
    requires same_as<remove_cvref_t<T>, T> && formattable<T, CharT>
  class range_formatter
  {
    formatter<T, CharT> /*underlying_*/; // 説明専用
    basic_string_view<CharT> /*separator_*/ =
      /*STATICALLY-WIDEN*/<CharT>(", "); // 説明専用
    basic_string_view<CharT> /*opening-bracket_*/ =
      /*STATICALLY-WIDEN*/<CharT>("[");  // 説明専用
    basic_string_view<CharT> /*closing-bracket_*/ =
      /*STATICALLY-WIDEN*/<CharT>("]");  // 説明専用
  public:
    constexpr void set_separator(basic_string_view<CharT> sep) noexcept;
    constexpr void set_brackets(basic_string_view<CharT> opening,
                                basic_string_view<CharT> closing) noexcept;
    constexpr formatter<T, CharT>& underlying() noexcept { return /*underlying_*/; }
    constexpr const formatter<T, CharT>& underlying() const noexcept
    {
      return /*underlying_*/;
    }
    template<class ParseContext>
    constexpr typename ParseContext::iterator parse(ParseContext& ctx);
    template<ranges::input_range R, class FormatContext>
      requires formattable<ranges::range_reference_t<R>, CharT> &&
               same_as<remove_cvref_t<ranges::range_reference_t<R>>, T>
    typename FormatContext::iterator format(R&& r, FormatContext& ctx) const;
  };
}

クラステンプレート __range_default_formatter

namespace std {
  template<ranges::input_range R, class CharT>
  struct /*range-default-formatter*/<range_format::sequence, R, CharT>
  {                                                          // 説明専用
  private:
    using /*maybe-const-r*/ = /*fmt-maybe-const*/<R, CharT>; // 説明専用
    range_formatter<remove_cvref_t<ranges::range_reference_t</*maybe-const-r*/>>,
                    CharT>
      /*underlying_*/;                                       // 説明専用
  public:
    constexpr void set_separator(basic_string_view<CharT> sep) noexcept;
    constexpr void set_brackets(basic_string_view<CharT> opening,
                                basic_string_view<CharT> closing) noexcept;
    template<class ParseContext>
    constexpr typename ParseContext::iterator parse(ParseContext& ctx);
    template<class FormatContext>
    typename FormatContext::iterator format(/*maybe-const-r*/& elems,
                                            FormatContext& ctx) const;
  };
}

map 向け __range_default_formatter の特殊化

namespace std {
  template<ranges::input_range R, class CharT>
  struct /*range-default-formatter*/<range_format::map, R, CharT>
  {
  private:
    using /*maybe-const-map*/ = /*fmt-maybe-const*/<R, CharT>; // 説明専用
    using /*element-type*/ =                                   // 説明専用
      remove_cvref_t<ranges::range_reference_t</*maybe-const-map*/>>;
    range_formatter</*element-type*/, CharT> /*underlying_*/;  // 説明専用
  public:
    constexpr /*range-default-formatter*/();
    template<class ParseContext>
    constexpr typename ParseContext::iterator parse(ParseContext& ctx);
    template<class FormatContext>
    typename FormatContext::iterator format(/*maybe-const-map*/& r,
                                            FormatContext& ctx) const;
  };
}

__range_default_formatter の sets に対する特殊化

namespace std {
  template<ranges::input_range R, class CharT>
  struct /*range-default-formatter*/<range_format::set, R, CharT>
  {
  private:
    using /*maybe-const-set*/ = /*fmt-maybe-const*/<R, CharT>; // 説明専用
    range_formatter<remove_cvref_t<ranges::range_reference_t</*maybe-const-set*/>>,
                    CharT>
      /*underlying_*/;                                         // 説明専用
  public:
    constexpr /*range-default-formatter*/();
    template<class ParseContext>
    constexpr typename ParseContext::iterator parse(ParseContext& ctx);
    template<class FormatContext>
    typename FormatContext::iterator format(/*maybe-const-set*/& r,
                                            FormatContext& ctx) const;
  };
}

__range_default_formatter の文字列に対する特殊化

namespace std {
  template<range_format K, ranges::input_range R, class CharT>
    requires(K == range_format::string || K == range_format::debug_string)
  struct /*range-default-formatter*/<K, R, CharT>
  {
  private:
    formatter<basic_string<CharT>, CharT> /*underlying_*/; // 説明専用
  public:
    template<class ParseContext>
    constexpr typename ParseContext::iterator parse(ParseContext& ctx);
    template<class FormatContext>
    typename FormatContext::iterator format(/* 説明を参照 */ &str,
                                            FormatContext& ctx) const;
  };
}

クラステンプレート std::basic_format_arg

namespace std {
  template<class Context> class basic_format_arg
  {
  public:
    class handle;
  private:
    using char_type = typename Context::char_type; // 説明専用
    variant<monostate,
            bool,
            char_type,
            int,
            unsigned int,
            long long int,
            unsigned long long int,
            float,
            double,
            long double,
            const char_type*,
            basic_string_view<char_type>,
            const void*,
            handle>
      value;                                                    // 説明専用
    template<class T> explicit basic_format_arg(T& v) noexcept; // 説明専用
  public:
    basic_format_arg() noexcept;
    explicit operator bool() const noexcept;
    template<class Visitor>
    decltype(auto) visit(this basic_format_arg arg, Visitor&& vis);
    template<class R, class Visitor> R visit(this basic_format_arg arg, Visitor&& vis);
  };
}

クラス std::basic_format_arg::handle

namespace std {
  template<class Context> class basic_format_arg<Context>::handle
  {
    const void* ptr_;                                   // 説明専用
    void (*format_)(basic_format_parse_context<char_type>&,
                    Context&,
                    const void*);                       // 説明専用
    template<class T> explicit handle(T& val) noexcept; // 説明専用
  public:
    void format(basic_format_parse_context<char_type>&, Context& ctx) const;
  };
}

クラステンプレート __format_arg_store

namespace std {
  template<class Context, class... Args> class /*format-arg-store*/
  {                                                             // 説明専用
    array<basic_format_arg<Context>, sizeof...(Args)> /*args*/; // 説明専用
  };
}

クラステンプレート std::basic_format_args

namespace std {
  template<class Context> class basic_format_args
  {
    size_t size_;                           // 説明専用
    const basic_format_arg<Context>* data_; // 説明専用
  public:
    template<class... Args>
    basic_format_args(const /*format-arg-store*/<Context, Args...>& store) noexcept;
    basic_format_arg<Context> get(size_t i) const noexcept;
  };
  template<class Context, class... Args>
  basic_format_args(/*format-arg-store*/<Context, Args...>) -> basic_format_args<Context>;
}

Tupleフォーマッタ

namespace std {
  template<class CharT, formattable<CharT>... Ts>
  struct formatter</*pair-or-tuple*/<Ts...>, CharT>
  {
  private:
    tuple<formatter<remove_cvref_t<Ts>, CharT>...> /*underlying_*/; // 説明専用
    basic_string_view<CharT> /*separator_*/ =
      /*STATICALLY-WIDEN*/<CharT>(", ");                            // 説明専用
    basic_string_view<CharT> /*opening-bracket_*/ =
      /*STATICALLY-WIDEN*/<CharT>("(");                             // 説明専用
    basic_string_view<CharT> /*closing-bracket_*/ =
      /*STATICALLY-WIDEN*/<CharT>(")");                             // 説明専用
  public:
    constexpr void set_separator(basic_string_view<CharT> sep) noexcept;
    constexpr void set_brackets(basic_string_view<CharT> opening,
                                basic_string_view<CharT> closing) noexcept;
    template<class ParseContext>
    constexpr typename ParseContext::iterator parse(ParseContext& ctx);
    template<class FormatContext>
    typename FormatContext::iterator format(/* 説明を参照 */ &elems,
                                            FormatContext& ctx) const;
  };
  template<class... Ts>
  constexpr bool enable_nonlocking_formatter_optimization</*pair-or-tuple*/<Ts...>> =
    (enable_nonlocking_formatter_optimization<Ts> && ...);
}

クラス std::format_error

namespace std {
  class format_error : public runtime_error
  {
  public:
    constexpr explicit format_error(const string& what_arg);
    constexpr explicit format_error(const char* what_arg);
  };
}