namespace std {
template<class Context = format_context, class... Args>
format_arg_store<Context, Args...> make_format_args(Args&&... args); // (1)
template<class... Args>
format_arg_store<wformat_context, Args...> make_wformat_args(Args&&... args); // (2)
}
概要
可変長引数の型を消去して、basic_format_argの列に変換する。
戻り値の型 format_arg_store は便宜上次の通り定義されるが、その型名は規格に含まれない。
namespace std {
template<class Context, class... Args>
struct format_arg_store { // exposition only
array<basic_format_arg<Context>, sizeof...(Args)> args;
};
}
basic_format_argsはformat_arg_storeから構築できる。
make_format_argsの結果はただちにbasic_format_argsへ変換するのが意図された使い方である。
template<class... Args>
string format(string_view fmt, const Args&... args)
{
return vformat(fmt, {make_format_args(args...)}); // format_arg_store から format_args へ暗黙変換
}
事前条件
すべての引数の型TiについてContext::formatter_type<Ti>がFormatter要件を満たすこと。
戻り値
(1)
return {basic_format_arg<Context>(args)...}
(2)
return make_format_args<wformat_context>(args...);
例
#include <iostream>
#include <format>
int main() {
std::string fmt = "0x{:x} 0b{:04b}";
std::string s = std::vformat(fmt, std::make_format_args(10, 6));
std::cout << s << std::endl;
}
出力
0xa 0b0110
実装例
namespace std {
template<class Context = format_context, class... Args>
format_arg_store<Context, Args...> make_format_args(const Args&... args)
{
return {basic_format_arg<Context>(args)...}
}
template<class... Args>
format_arg_store<wformat_context, Args...> make_wformat_args(const Args&... args)
{
return make_format_args<wformat_context>(args...);
}
}
バージョン
言語
- C++20
処理系
- Clang: 17
- GCC: 13
- Visual C++: ??