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

履歴 編集

concept
<format>

std::formattable(C++23)

namespace std {
  template <class charT>
  using fmt-iter-for = /* unspecified */;

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

概要

formattableは、文字列フォーマット可能であることを表すコンセプトである。

このコンセプトを使用することで、formatterクラステンプレートが使用したい型で特殊化されているかをチェックできる。

formattableコンセプトの定義において使用されているfmt-iter-for<charT>は、output_iterator<const charT&>コンセプトのモデルとなる未規定の型である。

#include <iostream>
#include <format>
#include <any>

template <std::formattable<char> T>
void f(T x) {
  std::cout << std::format("{}", x) << std::endl;
}

int main() {
  f(3);       // OK
  f("hello"); // OK
//f(std::any{3}); // NG : std::anyはstd::formatterを特殊化していない
}

出力

3
hello

バージョン

言語

  • C++23

処理系

参照