format_to
format_to (C++20 형식 문자열을 출력 반복자에 기록)
이 페이지는 C++20 표준 라이브러리의 std::format_to 함수에 대해 설명해요. format_to는 주어진 형식 문자열에 따라 인자를 문자열로 변환하고, 그 결과를 출력 반복자(out)에 기록하는 함수 템플릿이에요. 로케일 지정 오버로드도 있어서 지역화된 형식 지정도 지원해요.
출처: cppreference
본문
개요
<format> 헤더에 정의됨 |
||
|---|---|---|
template < class OutputIt , class ... Args > OutputIt format_to ( OutputIt out , std :: format_string < Args ... > fmt , Args && ... args ); |
(1) | (since C++20) |
template < class OutputIt , class ... Args > OutputIt format_to ( OutputIt out , std :: wformat_string < Args ... > fmt , Args && ... args ); |
(2) | (since C++20) |
template < class OutputIt , class ... Args > OutputIt format_to ( OutputIt out , const std :: locale & loc , std :: format_string < Args ... > fmt , Args && ... args ); |
(3) | (since C++20) |
template < class OutputIt , class ... Args > OutputIt format_to ( OutputIt out , const std :: locale & loc , std :: wformat_string < Args ... > fmt , Args && ... args ); |
(4) | (since C++20) |
형식 문자열 fmt에 따라 인자를 형식화하고, 그 결과를 출력 반복자 out에 써요. loc이 제공되면 로케일별 형식 지정에 사용해요.
다음과 동일해요:
- 오버로드 (1,3)에서는
CharT를char로, 오버로드 (2,4)에서는wchar_t로 둬요. - 이 오버로드들은
OutputIt이std::output_iterator<const CharT&>개념을 만족할 때만 오버로드 해석에 참여해요.
다음 조건 중 하나라도 만족되면 동작이 정의되지 않아요:
OutputIt이std::output_iterator<const CharT&>를 모델링하지 않아요.Args안의 어떤Ti에 대해std::formatter<Ti, CharT>가BasicFormatter요구 사항(std::make_format_args와std::make_wformat_args에서 요구하는)을 충족하지 못해요.
매개변수
| 매개변수 | 설명 |
|---|---|
out |
출력 버퍼를 가리키는 반복자 |
fmt |
형식 문자열을 나타내는 객체. 형식 문자열은 일반 문자({와 } 제외)로 구성되며, 이 문자들은 출력에 그대로 복사돼요. 이스케이프 시퀀스 {{와 }}는 각각 출력에서 {와 }로 바뀌어요. 그리고 치환 필드(replacement field)가 있어요. 각 치환 필드는 다음 형식을 가져요: |
{ arg-id (선택) } (1) — 형식 지정 없이 치환 필드 |
|
{ arg-id (선택) : format-spec } (2) — 형식 지정이 있는 치환 필드 |
|
arg-id |
args에서 형식화에 사용할 인자의 인덱스를 지정해요. 생략하면 인자들이 순서대로 사용돼요. 형식 문자열의 arg-id는 모두 있거나 모두 생략되어야 해요. 수동 인덱싱과 자동 인덱싱을 섞으면 오류예요. |
format-spec |
해당 인자에 대한 std::formatter 전문화에 의해 정의된 형식 지정이에요. }로 시작할 수 없어요. 기본 타입과 표준 문자열 타입의 경우 표준 형식 지정으로 해석돼요. chrono 타입은 chrono 형식 지정으로, range 타입은 range 형식 지정으로, std::pair와 std::tuple은 튜플 형식 지정으로 해석돼요. std::thread::id와 std::stacktrace_entry는 각각 스레드 ID 형식 지정과 스택트레이스 항목 형식 지정을 참조해요. std::basic_stacktrace에는 형식 지정자를 사용할 수 없어요. (since C++23) std::filesystem::path는 경로 형식 지정을 참조해요. (since C++26) 다른 형식화 가능한 타입의 경우 형식 지정은 사용자 정의 formatter 전문화에 의해 결정돼요. |
args... |
형식화할 인자들 |
loc |
로케일별 형식 지정에 사용할 std::locale |
반환값
출력 범위의 끝을 가리키는 반복자예요.
예외
형식화나 반복자 연산에서 발생하는 모든 예외를 전파해요.
참고
P2216R3 이후로, 형식 문자열이 상수 표현식이 아니면 오류예요. 이 경우 std::vformat_to 또는 std::runtime_format(since C++26)을 사용할 수 있어요.
예제
#include <format>
#include <iostream>
#include <iterator>
#include <string>
int main()
{
std::string buffer;
std::format_to
(
std::back_inserter(buffer), // < OutputIt
"Hello, C++{}!\n", // < fmt
"20" // < arg
);
std::cout << buffer;
buffer.clear();
std::format_to
(
std::back_inserter(buffer), // < OutputIt
"Hello, {0}::{1}!{2}", // < fmt
"std", // < arg {0}
"format_to()", // < arg {1}
"\n", // < arg {2}
"extra param(s)..." // < unused
);
std::cout << buffer << std::flush;
std::wstring wbuffer;
std::format_to
(
std::back_inserter(wbuffer),// < OutputIt
L"Hello, {2}::{1}!{0}", // < fmt
L"\n", // < arg {0}
L"format_to()", // < arg {1}
L"std", // < arg {2}
L"...is not..." // < unused
L"...an error!" // < unused
);
std::wcout << wbuffer;
}
출력:
Hello, C++20!
Hello, std::format_to()!
Hello, std::format_to()!
결함 보고서
다음 동작 변경 결함 보고서는 이미 게시된 C++ 표준에 소급 적용되었어요.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3539 | C++20 | out은 이동 전용 반복자일 수 없었어요 |
이동 전용 반복자도 가능해요 |
| P2216R3 | C++20 | 잘못된 형식 문자열에 대해 std::format_error를 던졌어요 |
대신 컴파일 타임 오류가 돼요 |
| P2418R2 | C++20 | const로 사용할 수 없거나 복사할 수 없는 객체(제너레이터 같은)는 형식화할 수 없었어요 | 이런 객체도 형식화할 수 있게 허용해요 |
| P2508R1 | C++20 | 이 기능에 사용자에게 보이는 이름이 없었어요 | basic_format_string 이름이 노출돼요 |
같이 보기
format (C++20) |
인자의 형식화된 표현을 새 문자열에 저장해요 (함수 템플릿) |
|---|---|
format_to_n (C++20) |
지정된 크기를 초과하지 않고 인자의 형식화된 표현을 출력 반복자를 통해 써요 (함수 템플릿) |