format_vformat

format_vformat (서식 문자열로 인자를 문자열로 변환)

이 페이지는 C++20에서 추가된 std::vformat 함수에 대해 설명해요. vformat은 형식 문자열과 인자 목록을 받아 서식화된 문자열을 만들어요. 로케일을 지정하면 지역별 형식도 적용할 수 있어요.

출처: cppreference

본문

함수 정의

<format> 헤더에 정의되어 있어요.

함수 번호 버전
std :: string vformat ( std :: string_view fmt , std :: format_args args ); (1) (since C++20)
std :: wstring vformat ( std :: wstring_view fmt , std :: wformat_args args ); (2) (since C++20)
std :: string vformat ( const std :: locale & loc , std :: string_view fmt , std :: format_args args ); (3) (since C++20)
std :: wstring vformat ( const std :: locale & loc , std :: wstring_view fmt , std :: wformat_args args ); (4) (since C++20)

args에 담긴 인자들을 형식 문자열 fmt에 따라 서식화하고, 그 결과를 문자열로 반환해요. loc가 주어지면 로케일별 서식화에 사용해요.

매개변수

  • fmt - 형식 문자열을 나타내는 객체예요. 형식 문자열은 일반 문자({} 제외)로 구성되며, 이 문자들은 그대로 출력에 복사돼요. 이스케이프 시퀀스 {{}}는 각각 {}로 바뀌어 출력돼요. 그리고 치환 필드(replacement field)가 있어요. 각 치환 필드는 다음과 같은 형식을 가져요.
    • { arg-id (optional) } (1) - 형식 지정 없이 인자만 사용해요.
    • { arg-id (optional) : format-spec } (2) - 형식 지정을 포함해요.
    • arg-id - args에서 서식화에 사용할 인자의 인덱스를 지정해요. 생략하면 인자들이 순서대로 사용돼요. 형식 문자열의 arg-id는 모두 있거나 모두 생략해야 해요. 수동 인덱싱과 자동 인덱싱을 섞으면 오류예요.
    • format-spec - 해당 인자에 대한 std::formatter 전문화에 의해 정의된 형식 지정이에요. }로 시작할 수 없어요. 기본 타입과 표준 문자열 타입의 경우 표준 형식 지정으로 해석돼요. chrono 타입은 chrono 형식 지정, 범위 타입은 range 형식 지정, std::pairstd::tuple은 tuple 형식 지정으로 해석돼요. std::thread::idstd::stacktrace_entry는 각각 thread id 형식 지정과 stacktrace entry 형식 지정을 참고해요. std::basic_stacktrace에는 형식 지정자를 사용할 수 없어요. (since C++23) std::filesystem::path는 path 형식 지정을 참고해요. (since C++26) 그 외 서식화 가능한 타입은 사용자 정의 formatter 전문화에 따라 형식 지정이 결정돼요.
  • args - 서식화할 인자들이에요.
  • loc - 로케일별 서식화에 사용되는 std::locale이에요.

반환 값

서식화된 결과를 담은 문자열 객체를 반환해요.

예외

fmt가 제공된 인자에 대해 유효한 형식 문자열이 아니면 std::format_error를 던지고, 할당 실패 시 std::bad_alloc을 던져요. 또한 formatter나 반복자 연산에서 발생한 예외도 전파해요.

예제

#include <format>
#include <iostream>

template<typename... Args>
inline void println(const std::format_string<Args...> fmt, Args&&... args)
{
    std::cout << std::vformat(fmt.get(), std::make_format_args(args...)) << '\n';
}

int main()
{
    println("{}{} {}{}", "Hello", ',', "C++", -1 + 2 * 3 * 4);
}

Output:

Hello, C++23

더 알아보기 (Learn more)

cppreference