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::pairstd::tuple의 경우 튜플 형식 사양으로 해석돼요. std::thread::idstd::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_formatstd::basic_format_args를 인자로 요구하는 std::vformat 대신 std::format에 직접 사용할 수 있어요. (C++26부터)

std::dynamic_formatstd::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) 지정된 크기를 초과하지 않고 출력 반복자를 통해 인자의 서식화된 표현을 출력하는 함수 템플릿

더 알아보기 (Learn more)

cppreference