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
処理系
- Clang: ??
- GCC: 13 ✅
- Visual C++: ??