format_format
format_format (std::format - 문자열 서식 지정 함수)
이 페이지는 C++20에서 도입된 std::format 함수 템플릿에 대해 설명해요. std::format은 서식 문자열과 가변 인자들을 받아 서식이 적용된 결과를 문자열로 반환하는 타입 안전한 서식화 함수예요. 서식 문자열은 컴파일 타임에 검증되어 오류를 미리 방지할 수 있어요.
출처: cppreference
본문
개요
<format> 헤더에 정의되어 있으며, 다음과 같은 4가지 오버로드가 제공돼요.
| Defined in header |
||
|---|---|---|
| template < class ... Args > std :: string format ( std :: format_string < Args ... > fmt , Args && ... args ); | (1) | (since C++20) |
| template < class ... Args > std :: wstring format ( std :: wformat_string < Args ... > fmt , Args && ... args ); | (2) | (since C++20) |
| template < class ... Args > std :: string format ( const std :: locale & loc , std :: format_string < Args ... > fmt , Args && ... args ); | (3) | (since C++20) |
| template < class ... Args > std :: wstring format ( const std :: locale & loc , std :: wformat_string < Args ... > fmt , Args && ... args ); | (4) | (since C++20) |
서식 문자열 fmt에 따라 인자들을 서식화하고, 결과를 문자열로 반환해요. loc이 제공되면 로케일별 서식화에 사용돼요.
P2216R3 이후로 std::format은 서식 문자열에 대해 컴파일 타임 검사를 수행해요 (헬퍼 타입 std::format_string 또는 std::wformat_string을 통해). 서식 문자열이 인자 타입들에 대해 유효하지 않으면 컴파일 오류가 발생해요. 서식 문자열이 컴파일 타임 상수가 될 수 없거나 컴파일 타임 검사를 피해야 한다면, std::vformat 또는 (C++26부터) fmt에 대한 std::dynamic_format을 사용하면 돼요.
Args의 각 타입 T에 대해 다음 요구 사항이 적용돼요. 여기서 CharT는 오버로드 (1,3)에서는 char, 오버로드 (2,4)에서는 wchar_t예요.
std::formatter<T, CharT>는 BasicFormatter 요구 사항을 충족해야 해요.std::formatter<T, CharT>::parse()는 P2216R3 이후로 constexpr이어야 해요 (std::vformat에는 이 요구 사항이 없어요).
매개변수
| 매개변수 | 설명 |
|---|---|
fmt |
서식 문자열을 나타내는 객체예요. 서식 문자열은 출력에 그대로 복사되는 일반 문자({와 } 제외), 각각 {와 }로 치환되는 이스케이프 시퀀스 {{와 }}, 그리고 치환 필드로 구성돼요. 각 치환 필드는 다음 형식을 가져요: { arg-id (optional) } (1) { arg-id (optional) : format-spec } (2) 1) 형식 사양이 없는 치환 필드 2) 형식 사양이 있는 치환 필드. arg-id - 서식화에 사용할 args 내 인자의 인덱스를 지정해요. 생략하면 인자들이 순서대로 사용돼요. 서식 문자열의 arg-id들은 모두 있거나 모두 생략되어야 해요. 수동 인덱싱과 자동 인덱싱을 혼합하면 오류예요. format-spec - 해당 인자에 대한 std::formatter 특수화에 의해 정의되는 형식 사양이에요. }로 시작할 수 없어요. 기본 타입과 표준 문자열 타입의 경우 형식 사양은 표준 형식 사양으로 해석돼요. chrono 타입의 경우 chrono 형식 사양으로 해석돼요. 범위 타입의 경우 범위 형식 사양으로 해석돼요. std::pair와 std::tuple의 경우 튜플 형식 사양으로 해석돼요. std::thread::id와 std::stacktrace_entry의 경우 스레드 ID 형식 사양 및 스택트레이스 항목 형식 사양을 참조하세요. std::basic_stacktrace의 경우 형식 지정자가 허용되지 않아요. (C++23부터) std::filesystem::path의 경우 경로 형식 사양을 참조하세요. (C++26부터) 다른 서식화 가능한 타입의 경우 형식 사양은 사용자 정의 formatter 특수화에 의해 결정돼요. |
args... |
서식화할 인자들이에요. |
loc |
로케일별 서식화에 사용되는 std::locale이에요. |
반환값
서식화된 결과를 담은 문자열 객체를 반환해요.
예외
할당 실패 시 std::bad_alloc을 던져요. 또한 어떤 formatter가 던진 예외도 전파해요.
비고
서식 문자열이 요구하는 것보다 더 많은 인자를 제공하는 것은 오류가 아니에요.
std::format("{} {}!", "Hello", "world", "something"); // OK, produces "Hello world!"
P2216R3 이후로 서식 문자열이 상수 표현식이 아니면 오류예요. 이 경우 std::vformat을 사용할 수 있어요.
std::string f(std::string_view runtime_format_string)
{
// return std::format(runtime_format_string, "foo", "bar"); // error
return std::vformat(runtime_format_string, std::make_format_args("foo", "bar")); // OK
}
std::dynamic_format은 std::basic_format_args를 인자로 요구하는 std::vformat 대신 std::format에 직접 사용할 수 있어요. (C++26부터)
std::dynamic_format을 std::format에 직접 사용할 수 있어요. std :: string f ( std :: string_view runtime_format_string ) { return std :: format ( std :: dynamic_format ( runtime_format_string ), "foo" , "bar" ); } |
(since C++26) |
|---|
예제
#include <format>
#include <iostream>
#include <string>
#include <string_view>
template<typename... Args>
std::string dyna_print(std::string_view rt_fmt_str, Args&&... args)
{
return std::vformat(rt_fmt_str, std::make_format_args(args...));
}
int main()
{
std::cout << std::format("Hello {}!\n", "world");
std::string fmt;
for (int i{}; i != 3; ++i)
{
fmt += "{} "; // constructs the formatting string
std::cout << fmt << " : ";
std::cout << dyna_print(fmt, "alpha", 'Z', 3.14, "unused");
std::cout << '\n';
}
}
출력:
Hello world!
{} : alpha
{} {} : alpha Z
{} {} {} : alpha Z 3.14
결함 보고 (Defect reports)
다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었어요.
| DR | 적용 대상 | 기존 동작 | 수정된 동작 |
|---|---|---|---|
| P2216R3 | C++20 | 유효하지 않은 서식 문자열에 대해 std::format_error를 던짐 |
유효하지 않은 서식 문자열은 컴파일 타임 오류를 발생시킴 |
| P2418R2 | C++20 | const 사용도 복사도 불가능한 객체(예: generator 유사 객체)는 서식화할 수 없음 | 이러한 객체의 서식화를 허용 |
| P2508R1 | C++20 | 이 기능에 사용자에게 보이는 이름이 없음 | basic_format_string 이름이 노출됨 |
같이 보기
format_to (C++20) |
출력 반복자를 통해 인자의 서식화된 표현을 출력하는 함수 템플릿 |
|---|---|
format_to_n (C++20) |
지정된 크기를 초과하지 않고 출력 반복자를 통해 인자의 서식화된 표현을 출력하는 함수 템플릿 |