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)에서는 CharTchar로, 오버로드 (2,4)에서는 wchar_t로 둬요.
  • 이 오버로드들은 OutputItstd::output_iterator<const CharT&> 개념을 만족할 때만 오버로드 해석에 참여해요.

다음 조건 중 하나라도 만족되면 동작이 정의되지 않아요:

  • OutputItstd::output_iterator<const CharT&>를 모델링하지 않아요.
  • Args 안의 어떤 Ti에 대해 std::formatter<Ti, CharT>BasicFormatter 요구 사항(std::make_format_argsstd::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::pairstd::tuple은 튜플 형식 지정으로 해석돼요. std::thread::idstd::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) 지정된 크기를 초과하지 않고 인자의 형식화된 표현을 출력 반복자를 통해 써요 (함수 템플릿)

더 알아보기 (Learn more)

cppreference