type_identity<T>は受け取った型を返すだけのtype_traits
- クラステンプレートに包まれたパラメータは推論できないことを利用して、明示的に型推論を無効化するのに使う
- 実践として、
format_stringのパラメータを、フォーマット文字列の型ではなく、後続の引数の型から推論させるために使われている
format_stringはconstevalで書式の検査を行うためにパラメータを必要とする
template <typename... Ts>
struct format_string {
consteval F(string_view str) : str{str} {}
string_view str;
};
template <typename... Ts>
using format_string_t = format_string<type_identity_t<Ts>...>;
// type_identityがないと、fmtに与えられる引数から型を推論しようとするのでエラーになる。
template <typename... Ts>
void format(format_string_t<Ts...> fmt, Ts&&...);