- format[meta header]
- function template[meta id-type]
- std[meta namespace]
- cpp20[meta cpp]
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)
}- format_arg_store[italic]
- wformat_context[link /reference/format/basic_format_context.md]
可変長引数の型を消去して、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;
};
}- format_arg_store[italic]
- basic_format_arg[link /reference/format/basic_format_arg.md]
- array[link /reference/array/array.md]
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要件を満たすこと。
(2)は次と等しい。
return make_format_args<wformat_context>(args...);- wformat_context[link /reference/format/basic_format_context.md]
(1)は次と等しい。
return {basic_format_arg<Context>(args)...}- basic_format_arg[link /reference/format/basic_format_arg.md]
ただし、便宜上、basic_format_argは次のprivateメンバを持つとする。
(これらのprivateメンバは規格に含まれない)
namespace std {
template<class Context>
class basic_format_arg {
public:
class handle;
private:
using charT = typename Context::char_type;
variant<monostate, bool, charT,
int, unsigned int, long long int, unsigned long long int,
float, double, long double,
const charT*, basic_string_view<charT>,
const void*, handle> value;
template<typename T> explicit basic_format_arg(const T& v) noexcept; // (a)
explicit basic_format_arg(float n) noexcept; // (b)
explicit basic_format_arg(double n) noexcept; // (c)
explicit basic_format_arg(long double n) noexcept; // (d)
explicit basic_format_arg(const charT* s); // (e)
template<class traits>
explicit basic_format_arg(
basic_string_view<charT, traits> s) noexcept; // (f)
template<class traits, class Allocator>
explicit basic_format_arg(
const basic_string<charT, traits, Allocator>& s) noexcept; // (g)
explicit basic_format_arg(nullptr_t) noexcept; // (h)
template<class T>
explicit basic_format_arg(const T* p) noexcept; // (i)
template<class Ctx, class... Args>
friend format_arg_store<Ctx, Args...>
make_format_args(const Args&... args);
};
}- variant[link /reference/variant/variant.md]
- monostate[link /reference/variant/monostate.md]
- handle[link /reference/format/basic_format_arg/handle.md]
- basic_string[link /reference/string/basic_string.md]
- basic_string_view[link /reference/string_view/basic_string_view.md]
- basic_format_arg[link /reference/format/basic_format_arg.md]
ここで、それぞれの効果は次と等しい。
- (a):
TがboolまたはcharTなら、valueをvで初期化- または、
TがcharかつcharTがwchar_tなら、valueをstatic_cast<wchar_t>(v)で初期化 - または、
Tが符号つき整数型かつsizeof(T) <= sizeof(int)なら、valueをstatic_cast<int>(v)で初期化 - または、
Tが符号なし整数型かつsizeof(T) <= sizeof(unsigned int)なら、valueをstatic_cast<unsigned int>(v)で初期化 - または、
Tが符号つき整数型かつsizeof(T) <= sizeof(long long int)なら、valueをstatic_cast<long long int>(v)で初期化 - または、
Tが符号なし整数型かつsizeof(T) <= sizeof(unsigned long long int)なら、valueをstatic_cast<unsigned long long int>(v)で初期化 - または、
valueをhandle(v)で初期化
- (b),(c),(d):
valueをnで初期化 - (e):
valueをsで初期化 (sは有効なC文字列であること) - (f):
valueをsで初期化 - (g):
valueをbasic_string_view<charT>(s.data(), s.size())で初期化 - (h):
valueをstatic_cast<const void*>(nullptr)で初期化 - (i):
valueをpで初期化 (is_void_v<T>がtrueであること)
{basic_format_arg<Context>(args)...}
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...);
}
}- basic_format_arg[link /reference/format/basic_format_arg.md]
- wformat_context[link /reference/format/basic_format_context.md]
- C++20
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??