Namespaces
Variants

Formatting library (since C++20)

From cppreference.net

텍스트 서식 지정 라이브러리는 printf 함수 계열에 대한 안전하고 확장 가능한 대안을 제공합니다. 이는 기존 C++ I/O 스트림 라이브러리를 보완하기 위한 목적을 가지고 있습니다.

목차

형식 사양

형식 지정은 다양한 종류의 옵션으로 객체가 어떻게 형식화되는지 지정합니다.

기본 타입 및 표준 문자열 타입 객체의 서식 지정은 기본 형식 지정 을 사용합니다. 다른 라이브러리 구성 요소들도 자체적인 형식 지정을 제공할 수 있으며, 자세한 내용은 여기 를 참조하십시오.

서식 지정 함수

헤더 파일에 정의됨 <format>
(C++20)
인수의 형식화된 표현을 새 문자열에 저장함
(함수 템플릿)
(C++20)
출력 반복자를 통해 인수의 형식화된 표현을 출력함
(함수 템플릿)
출력 반복자를 통해 인수의 형식화된 표현을 지정된 크기를 초과하지 않도록 출력함
(함수 템플릿)
인수의 형식화된 표현을 저장하는 데 필요한 문자 수를 결정함
(함수 템플릿)

형식 문자열

헤더에 정의됨 <format>
생성 시점에 컴파일 타임 형식 문자열 검사를 수행하는 클래스 템플릿
(클래스 템플릿)
사용자 지향 형식화 함수에서 직접 사용 가능한 런타임 형식 문자열을 생성함
(함수)

포맷팅 개념

헤더 파일에 정의됨 <format>
특정 타입이 포맷 가능함을 지정하며, 이는 std::formatter 를 특수화하고 parse format 멤버 함수를 제공함을 의미합니다
(concept)

확장성 지원 및 구현 세부사항

헤더 파일에 정의됨 <format>
(C++20)
타입 삭제된 인수 표현을 사용하는 std::format 의 비템플릿 변형
(함수)
(C++20)
타입 삭제된 인수 표현을 사용하는 std::format_to 의 비템플릿 변형
(함수 템플릿)
모든 포맷팅 인수를 참조하는 타입 삭제된 객체를 생성하며, format_args 로 변환 가능함
(함수 템플릿)
(C++20) (C++26에서 사용 중단됨)
사용자 정의 포매터를 위한 인수 방문 인터페이스
(함수 템플릿)
(C++20)
주어진 타입에 대한 포맷팅 규칙을 정의함
(클래스 템플릿)
범위 타입에 대한 std::formatter 특수화 구현을 도와주는 클래스 템플릿
(클래스 템플릿)
인수 타입이 효율적으로 출력될 수 있음을 나타냄
(변수 템플릿)
범위가 포맷팅되는 방식을 지정함
(열거형)
범위에 적합한 std::range_format 을 선택함
(변수 템플릿)
사용자 정의 포매터를 위한 포맷팅 인수 접근을 제공하는 클래스 템플릿
(클래스 템플릿)
모든 포맷팅 인수에 대한 접근을 제공하는 클래스
(클래스 템플릿)
모든 포맷팅 인수와 출력 반복자를 포함하는 포맷팅 상태
(클래스 템플릿)
포맷팅 문자열 파서 상태
(클래스 템플릿)
포맷팅 오류 시 발생하는 예외 타입
(클래스)

헬퍼 항목 (since C++23)

template < class R, class CharT >

concept /*const-formattable-range*/ =
ranges:: input_range < const R > &&

std:: formattable < ranges:: range_reference_t < const R > , CharT > ;
(1) ( 설명 전용* )
template < class R, class CharT >

using /*fmt-maybe-const*/ =

std:: conditional_t < /*const-formattable-range*/ < R, CharT > , const R, R > ;
(2) ( 설명 전용* )

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_format 201907L (C++20) 텍스트 포매팅
202106L (C++23)
(DR20)
컴파일 타임 형식 문자열 검사;
std::vformat_to 의 매개변수화 축소
202110L (C++23)
(DR20)
chrono 포매터에서 로케일 처리 수정;
비-const-포맷 가능 타입 지원
202207L (C++23)
(DR20)
std::basic_format_string 노출;
chrono 타입의 지역화된 포매팅에서 인코딩 처리 명확화
202304L (C++26) 포인터 포매팅
202305L (C++26) 형식 인자 타입 검사
202306L (C++26) 멤버 std::basic_format_arg::visit
202311L (C++26) 런타임 형식 문자열
202403L (C++26) std::println 으로 빈 줄 출력
202403L (C++26)
(DR23)
std::print 의 효율적인 구현 허용
__cpp_lib_format_ranges 202207L (C++23) 범위 포매팅
__cpp_lib_format_path 202403L (C++26) std::filesystem::path 포매팅
__cpp_lib_format_uchar 202311L (C++26) 코드 유닛을 정수로 포매팅하는 문제 수정
__cpp_lib_formatters 202302L (C++23) std::thread::id std::stacktrace 포매팅

우리는 의도적으로 std::basic_format_string ( P2508 )의 추가를 결함 보고서(defect report)로 취급합니다. 공식적으로 그렇게 분류되지는 않았지만, 모든 알려진 구현체들이 이러한 구성 요소를 C++20 모드에서 사용 가능하게 만들기 때문입니다.

예제

#include <cassert>
#include <format>
int main()
{
    std::string message = std::format("The answer is {}.", 42);
    assert(message == "The answer is 42.");
}

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
P2418R2 C++20 const-형식화 가능하지도 않고 복사 가능하지도 않은 객체들
(생성기형 객체 등)은 형식화 불가능
이러한 객체들의 형식화 허용
(완화된 formatter 요구사항)
P2508R1 C++20 이 기능에 대한 사용자 가시적 이름이 없음 basic_format_string 이름이 노출됨

참고 항목

(C++23)
인수들의 형식화된 표현을 사용하여 stdout 또는 파일 스트림에 출력
(함수 템플릿)
(C++23)
각 출력이 추가적인 개행으로 종료된다는 점을 제외하고 std::print 와 동일
(함수 템플릿)
인수들의 형식화된 표현을 출력
(함수 템플릿)