format_make_format_args

format_make_format_args (서식 지정 인자 만들기)

make_format_args 함수는 서식 지정(formatting)에 사용할 인자들을 모아 저장하는 객체를 반환해요. 이 객체는 std::basic_format_args<Context>로 암시적으로 변환될 수 있어서 std::vformat 같은 타입 지움 함수에 그대로 전달할 수 있답니다. C++20부터 사용할 수 있어요.

출처: cppreference

본문

<format> 헤더에 정의됨
template < class Context = std :: format_context , class ... Args > /*format-arg-store*/ < Context , Args ... > make_format_args ( Args & ... args ); (1) (C++20부터)
template < class ... Args > /*format-arg-store*/ < std :: wformat_context , Args ... > make_wformat_args ( Args & ... args ); (2) (C++20부터)

서식 지정 인자 배열을 저장하는 객체를 반환하며, 이 객체는 std::basic_format_args<Context>로 암시적으로 변환될 수 있어요.

Args에 포함된 어떤 Ti에 대해 typename Context :: template formatter_type < std :: remove_const_t < Ti >>가 BasicFormatter 요구 사항을 충족하지 않으면 동작이 정의되지 않아요.

또한 Args의 어떤 타입 Ti__formattable_with < Context >를 충족하지 않으면 프로그램이 ill-formed예요.

매개변수

args... - 서식 지정 인자로 사용할 값들이에요

반환값

서식 지정 인자를 보관하는 객체를 반환해요.

각 인자 t의 타입을 T라고 할 때, TDstd :: remove_const_t < std :: remove_reference_t < T >>로 정의해요. 결과 객체에 저장되는 해당 std::basic_format_arg는 다음과 같이 결정돼요:

  • TDbool 또는 Context::char_type이면, std::basic_format_argt를 저장해요.
  • 그렇지 않고 TDchar이고 Context::char_typewchar_t이면, std::basic_format_argstatic_cast < wchar_t > ( static_cast < unsigned char > ( t ))를 저장해요.
  • 그렇지 않고 TDint보다 크지 않은 부호 있는 정수 타입이면, std::basic_format_argstatic_cast < int > ( t )를 저장해요.
  • 그렇지 않고 TDunsigned int보다 크지 않은 부호 없는 정수 타입이면, std::basic_format_argstatic_cast < unsigned int > ( t )를 저장해요.
  • 그렇지 않고 TDlong long보다 크지 않은 부호 있는 정수 타입이면, std::basic_format_argstatic_cast < long long > ( t )를 저장해요.
  • 그렇지 않고 TDunsigned long long보다 크지 않은 부호 없는 정수 타입이면, std::basic_format_argstatic_cast < unsigned long long > ( t )를 저장해요.
  • 그렇지 않고 TDfloat, double 또는 long double이면, std::basic_format_argt를 저장해요.
  • 그렇지 않고 TDstd::basic_string_view 또는 std::basic_string 특수화이고 TD::char_typeContext::char_type이면, std::basic_format_argstd :: basic_string_view < Context :: char_type > ( t . data (), t . size ())를 저장해요.
  • 그렇지 않고 std :: decay_t < TD >Context :: char_type * 또는 const Context :: char_type *이면, std::basic_format_argstatic_cast < const Context :: char_type *> ( t )를 저장해요.
  • 그렇지 않고 std :: is_void_v < std :: remove_pointer_t < TD >>true이거나 std :: is_null_pointer_v < TD >true이면, std::basic_format_argstatic_cast < const void *> ( t )를 저장해요.
  • 그 외에는 std::basic_format_argt에 대한 std :: basic_format_arg < Context >:: handlehandle::format()에 필요한 추가 데이터를 저장해요.

참고

서식 지정 인자는 사용자 정의 타입에 대해 참조 의미론을 가지며 args의 수명을 연장하지 않아요. 따라서 args가 반환값보다 오래 살아 있도록 하는 것은 프로그래머의 책임이에요. 보통 반환 결과는 서식 함수의 인자로만 사용돼요.

기능 테스트 매크로 표준 기능
__cpp_lib_format_uchar 202311L (C++20) (DR) 코드 단위를 부호 없는 정수로 서식 지정

예제

#include <array>
#include <format>
#include <iostream>
#include <string_view>

void raw_write_to_log(std::string_view users_fmt, std::format_args&& args)
{
    static int n{};
    std::clog << std::format("{:04} : ", n++) << std::vformat(users_fmt, args) << '\n';
}

template<typename... Args>
constexpr void log(Args&&... args)
{
    // Generate formatting string "{} "...
    std::array<char, sizeof...(Args) * 3 + 1> braces{};
    constexpr const char c[4] = "{} ";
    for (auto i{0uz}; i != braces.size() - 1; ++i)
        braces[i] = c[i % 3];
    braces.back() = '\0';

    raw_write_to_log(std::string_view{braces.data()}, std::make_format_args(args...));
}

template<typename T>
const T& unmove(T&& x)
{
    return x;
}

int main()
{
    log("Number", "of", "arguments", "is", "arbitrary.");
    log("Any type that meets the BasicFormatter requirements", "can be printed.");
    log("For example:", 1, 2.0, '3', "*42*");

    raw_write_to_log("{:02} │ {} │ {} │ {}",
                     std::make_format_args(unmove(1), unmove(2.0), unmove('3'), "4"));
}

출력:

0000 : Number of arguments is arbitrary.
0001 : Any type that meets the BasicFormatter requirements can be printed.
0002 : For example: 1 2.0 3 *42*
0003 : 01 │ 2.0 │ 3 │ 4

결함 보고 (Defect reports)

다음 동작 변경 결함 보고는 이미 발표된 C++ 표준에 소급 적용되었어요.

DR 적용 대상 발표된 동작 올바른 동작
P2418R2 C++20 const-usable도 아니고 복사 가능하지도 않은 객체(예: generator류 객체)는 서식 지정이 불가능했음 이런 객체도 서식 지정을 허용
P2905R2 C++20 make_format_args가 전달 참조로 rvalue 인자를 받아들였음 lvalue 참조만 받음
P2909R4 C++20 char 또는 wchar_t가 범위를 벗어난 부호 없는 정수 값으로 서식 지정될 수 있었음 코드 단위는 그러한 서식 지정 전에 해당 부호 없는 타입으로 변환됨
LWG 3631 C++20 P2418R2 이후 cv 한정 인자가 잘못 처리되었음 처리 방식 수정됨

같이 보기

basic_format_args format_args wformat_args (C++20) (C++20) (C++20) 모든 서식 지정 인자에 대한 접근을 제공하는 클래스 (클래스 템플릿)
vformat (C++20) 타입 지움 인자 표현을 사용하는 std::format의 비템플릿 변형 (함수)
vformat_to (C++20) 타입 지움 인자 표현을 사용하는 std::format_to의 비템플릿 변형 (함수 템플릿)

더 알아보기 (Learn more)

cppreference