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 :

Содержание

Базовые стандартные специализации

В следующем списке CharT обозначает либо char , либо wchar_t , ArithmeticT представляет любой cv-неквалифицированный арифметический тип, кроме char , wchar_t , char8_t , char16_t или char32_t :

Форматтеры для символов
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 > , которые потребовали бы преобразований кодировок, отключены.

Следующие специализации всё ещё отключены в C++23, чтобы избежать форматирования некоторых char последовательностей как диапазонов wchar_t :

Отключённые форматтеры для 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 , был ? .

Каждая специализация форматтера для строкового или символьного типа является debug-enabled .

(начиная с 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 Applied to Behavior as published Correct behavior
LWG 3944 C++23 некоторые последовательности char форматировались как диапазоны wchar_t добавленные специализации отключены

Смотрите также

состояние форматирования, включая все аргументы форматирования и выходной итератор
(шаблон класса)
указывает, что тип является форматируемым, то есть специализирует std::formatter и предоставляет функции-члены parse и format
(концепт)
шаблон класса, который помогает реализовывать std::formatter специализации для типов диапазонов
(шаблон класса)