Namespaces
Variants

std:: formatter

From ko.cppreference.net
헤더에 정의됨 <format>
template < class T, class CharT = char >
struct formatter ;
(C++20부터)

std::formatter 의 활성화된 특수화는 주어진 타입에 대한 서식 규칙을 정의합니다. 활성화된 특수화는 BasicFormatter 요구사항을 충족하며, 별도로 명시되지 않는 한 Formatter 요구사항도 충족합니다.

모든 타입 T 와 CharT 에 대해, 특수화 std::formatter<T, CharT> 가 활성화되지 않은 경우, 해당 특수화는 완전한 타입이며 비활성화됩니다.

비활성화된 특수화는 Formatter 요구사항을 충족하지 않으며, 다음은 모두 false 입니다:

**참고:** 제시된 HTML 코드에는 C++ 관련 용어(std::is_default_constructible_v 등)와 HTML 태그 외에 번역이 필요한 실제 텍스트 콘텐츠가 포함되어 있지 않습니다. 따라서 원본 형식과 모든 태그를 그대로 유지한 상태로 출력합니다.

목차

기본 표준 특수화

다음 목록에서, CharT 는 char 또는 wchar_t 입니다. ArithmeticT 는 char , wchar_t , char8_t , char16_t , 또는 char32_t 를 제외한 cv-한정자가 없는 모든 산술 타입입니다:

문자 포매터
template <>
struct formatter < char , char > ;
(1)
template <>
struct formatter < char , wchar_t > ;
(2)
template <>
struct formatter < wchar_t , wchar_t > ;
(3)
문자열 포매터
template <>
struct formatter < CharT * , CharT > ;
(4)
template <>
struct formatter < const CharT * , CharT > ;
(5)
template < std:: size_t N >
struct formatter < CharT [ N ] , CharT > ;
(6)
template < class Traits, class Alloc >
struct formatter < std:: basic_string < CharT, Traits, Alloc > , CharT > ;
(7)
template < class Traits >
struct formatter < std:: basic_string_view < CharT, Traits > , CharT > ;
(8)
산술 포매터
template <>
struct formatter < ArithmeticT, CharT > ;
(9)
포인터 포매터
template <>
struct formatter < std:: nullptr_t , CharT > ;
(10)
template <>
struct formatter < void * , CharT > ;
(11)
template <>
struct formatter < const void * , CharT > ;
(12)

다른 포인터 및 멤버 포인터에 대한 포맷터는 비활성화됩니다.

인코딩 변환이 필요한 std :: formatter < wchar_t , char > 및 std :: formatter < const char * , wchar_t > 와 같은 특수화는 비활성화됩니다.

다음 전문화들은 일부 char 시퀀스를 wchar_t 범위로 포맷하는 것을 피하기 위해 C++23에서 여전히 비활성화됩니다:

wchar_t 를 위한 비활성화된 포매터
template <>
struct formatter < char * , wchar_t > ;
(1)
template <>
struct formatter < const char * , wchar_t > ;
(2)
template < std:: size_t N >
struct formatter < char [ N ] , wchar_t > ;
(3)
template < class Traits, class Allocator >
struct formatter < std:: basic_string < char , Traits, Allocator > , wchar_t > ;
(4)
template < class Traits >
struct formatter < std:: basic_string_view < char , Traits > , wchar_t > ;
(5)

디버그 활성화된 포매터 전문화는 추가적으로 공개 비정적 멤버 함수 constexpr void set_debug_format ( ) ; 를 제공하며, 이는 포매터 객체의 상태를 수정하여 값들을 이스케이프되고 인용된 형태 로 포맷하도록 합니다. 마치 마지막 parse 호출에서 파싱된 형식 지정자의 타입 이 ? 인 것처럼 동작합니다.

문자열 또는 문자 타입에 대한 각 포매터 전문화는 디버그 활성화됩니다 .

(C++23부터)

표준 형식 사양

라이브러리 타입을 위한 표준 특수화

duration 에 대한 서식 지원
(클래스 템플릿 특수화)
sys_time 에 대한 서식 지원
(클래스 템플릿 특수화)
utc_time 에 대한 서식 지원
(클래스 템플릿 특수화)
tai_time 에 대한 서식 지원
(클래스 템플릿 특수화)
gps_time 에 대한 서식 지원
(클래스 템플릿 특수화)
file_time 에 대한 서식 지원
(클래스 템플릿 특수화)
local_time 에 대한 서식 지원
(클래스 템플릿 특수화)
day 에 대한 서식 지원
(클래스 템플릿 특수화)
month 에 대한 서식 지원
(클래스 템플릿 특수화)
year 에 대한 서식 지원
(클래스 템플릿 특수화)
weekday 에 대한 포맷팅 지원
(클래스 템플릿 특수화)
weekday_indexed 에 대한 서식 지원
(클래스 템플릿 특수화)
weekday_last 에 대한 서식 지원
(클래스 템플릿 특수화)
month_day 에 대한 포맷팅 지원
(클래스 템플릿 특수화)
month_day_last 에 대한 서식 지원
(클래스 템플릿 특수화)
month_weekday 에 대한 서식 지원
(클래스 템플릿 특수화)
month_weekday_last 에 대한 서식 지원
(클래스 템플릿 특수화)
year_month 에 대한 서식 지원
(클래스 템플릿 특수화)
year_month_day 에 대한 서식 지정 지원
(클래스 템플릿 특수화)
year_month_day_last 에 대한 서식 지원
(클래스 템플릿 특수화)
year_month_weekday 에 대한 서식 지원
(클래스 템플릿 특수화)
year_month_weekday_last 에 대한 서식 지원
(클래스 템플릿 특수화)
hh_mm_ss 에 대한 서식 지원
(클래스 템플릿 특수화)
sys_info 에 대한 포맷팅 지원
(클래스 템플릿 특수화)
local_info 에 대한 포맷팅 지원
(클래스 템플릿 특수화)
zoned_time 에 대한 서식 지원
(클래스 템플릿 특수화)
basic_stacktrace 에 대한 서식 지원
(클래스 템플릿 특수화)
stacktrace_entry 에 대한 서식 지원
(클래스 템플릿 특수화)
thread::id 에 대한 포맷팅 지원
(클래스 템플릿 특수화)
vector<bool>::reference 에 대한 서식 지원
(클래스 템플릿 특수화)
pair 및 tuple 에 대한 포매팅 지원
(클래스 템플릿 특수화)
범위에 대한 포매팅 지원
(클래스 템플릿 특수화)
std::stack 에 대한 서식 지원
(클래스 템플릿 특수화)
std::queue 에 대한 포맷팅 지원
(클래스 템플릿 특수화)
std::priority_queue 에 대한 서식 지원
(클래스 템플릿 특수화)
filesystem::path 에 대한 포맷팅 지원
(클래스 템플릿 특수화)

예제

#include <algorithm>
#include <format>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string_view>
struct QuotableString : std::string_view
{};
template<>
struct std::formatter<QuotableString, char>
{
    bool quoted = false;
    template<class ParseContext>
    constexpr ParseContext::iterator parse(ParseContext& ctx)
    {
        auto it = ctx.begin();
        if (it == ctx.end())
            return it;
        if (*it == '#')
        {
            quoted = true;
            ++it;
        }
        if (it != ctx.end() && *it != '}')
            throw std::format_error("Invalid format args for QuotableString.");
        return it;
    }
    template<class FmtContext>
    FmtContext::iterator format(QuotableString s, FmtContext& ctx) const
    {
        std::ostringstream out;
        if (quoted)
            out << std::quoted(s);
        else
            out << s;
        return std::ranges::copy(std::move(out).str(), ctx.out()).out;
    }
};
int main()
{
    QuotableString a("be"), a2(R"( " be " )");
    QuotableString b("a question");
    std::cout << std::format("To {0} or not to {0}, that is {1}.\n", a, b);
    std::cout << std::format("To {0:} or not to {0:}, that is {1:}.\n", a, b);
    std::cout << std::format("To {0:#} or not to {0:#}, that is {1:#}.\n", a2, b);
}

출력:

To be or not to be, that is a question.
To be or not to be, that is a question.
To " \" be \" " or not to " \" be \" ", that is "a question".

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 3944 C++23 일부 char 시퀀스가 wchar_t 범위로 포맷 가능했음 추가된 특수화 비활성화

참고 항목

포매팅 상태, 모든 포매팅 인자와 출력 반복자를 포함함
(클래스 템플릿)
타입이 포맷 가능함을 지정함, 즉 std::formatter 를 특수화하고 parse 와 format 멤버 함수를 제공함
(컨셉)
범위 타입에 대한 std::formatter 특수화 구현을 돕는 클래스 템플릿
(클래스 템플릿)