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라고 할 때, TD를 std :: remove_const_t < std :: remove_reference_t < T >>로 정의해요. 결과 객체에 저장되는 해당 std::basic_format_arg는 다음과 같이 결정돼요:
TD가bool또는Context::char_type이면,std::basic_format_arg는t를 저장해요.- 그렇지 않고
TD가char이고Context::char_type이wchar_t이면,std::basic_format_arg는static_cast < wchar_t > ( static_cast < unsigned char > ( t ))를 저장해요. - 그렇지 않고
TD가int보다 크지 않은 부호 있는 정수 타입이면,std::basic_format_arg는static_cast < int > ( t )를 저장해요. - 그렇지 않고
TD가unsigned int보다 크지 않은 부호 없는 정수 타입이면,std::basic_format_arg는static_cast < unsigned int > ( t )를 저장해요. - 그렇지 않고
TD가long long보다 크지 않은 부호 있는 정수 타입이면,std::basic_format_arg는static_cast < long long > ( t )를 저장해요. - 그렇지 않고
TD가unsigned long long보다 크지 않은 부호 없는 정수 타입이면,std::basic_format_arg는static_cast < unsigned long long > ( t )를 저장해요. - 그렇지 않고
TD가float,double또는long double이면,std::basic_format_arg는t를 저장해요. - 그렇지 않고
TD가std::basic_string_view또는std::basic_string특수화이고TD::char_type이Context::char_type이면,std::basic_format_arg는std :: basic_string_view < Context :: char_type > ( t . data (), t . size ())를 저장해요. - 그렇지 않고
std :: decay_t < TD >가Context :: char_type *또는const Context :: char_type *이면,std::basic_format_arg는static_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_arg는static_cast < const void *> ( t )를 저장해요. - 그 외에는
std::basic_format_arg가t에 대한std :: basic_format_arg < Context >:: handle과handle::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의 비템플릿 변형 (함수 템플릿) |