Namespaces
Variants

std:: formatter

From 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 특수화 구현을 돕는 클래스 템플릿
(클래스 템플릿)