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::pair와std::tuple은 tuple 형식 지정으로 해석돼요.std::thread::id와std::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