Namespaces
Variants

std:: formatter

From cppreference.net
Definido en el encabezado <format>
template < class T, class CharT = char >
struct formatter ;
(desde C++20)

Las especializaciones habilitadas de std::formatter definen las reglas de formato para un tipo dado. Las especializaciones habilitadas cumplen con los requisitos BasicFormatter y, a menos que se especifique lo contrario, también cumplen con los requisitos Formatter .

Para todos los tipos T y CharT para los cuales no está habilitada ninguna especialización std::formatter<T, CharT> , esa especialización es un tipo completo y está deshabilitada.

Las especializaciones deshabilitadas no cumplen con los Formatter requisitos, y los siguientes son todos false :

Contenidos

Especializaciones estándar básicas

En la siguiente lista, CharT es char o wchar_t , ArithmeticT es cualquier tipo aritmético sin calificadores cv excepto char , wchar_t , char8_t , char16_t , o char32_t :

Formateadores de caracteres
template <>
struct formatter < char , char > ;
(1)
template <>
struct formatter < char , wchar_t > ;
(2)
template <>
struct formatter < wchar_t , wchar_t > ;
(3)
Formateadores de cadenas
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)
Formateadores aritméticos
template <>
struct formatter < ArithmeticT, CharT > ;
(9)
Formateadores de punteros
template <>
struct formatter < std:: nullptr_t , CharT > ;
(10)
template <>
struct formatter < void * , CharT > ;
(11)
template <>
struct formatter < const void * , CharT > ;
(12)

Los formateadores para otros punteros y punteros a miembros están deshabilitados.

Especializaciones como std :: formatter < wchar_t , char > y std :: formatter < const char * , wchar_t > que requerirían conversiones de codificación están deshabilitadas.

Las siguientes especializaciones siguen deshabilitadas en C++23 para evitar formatear algunas char secuencias como rangos de wchar_t :

Formateadores deshabilitados para 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)

Una especialización de formateador habilitada para depuración adicionalmente proporciona una función miembro pública no estática constexpr void set_debug_format ( ) ; que modifica el estado del objeto formateador para que formatee los valores como escapados y entre comillas , como si el tipo del especificador de formato analizado por la última llamada a parse fuera ? .

Cada especialización de formateador para tipos de cadena o carácter está habilitada para depuración .

(desde C++23)

Especificación de formato estándar

Especializaciones estándar para tipos de biblioteca

soporte de formato para duration
(especialización de plantilla de clase)
soporte de formato para sys_time
(especialización de plantilla de clase)
soporte de formato para utc_time
(especialización de plantilla de clase)
soporte de formato para tai_time
(especialización de plantilla de clase)
soporte de formato para gps_time
(especialización de plantilla de clase)
soporte de formato para file_time
(especialización de plantilla de clase)
soporte de formato para local_time
(especialización de plantilla de clase)
soporte de formato para day
(especialización de plantilla de clase)
soporte de formato para month
(especialización de plantilla de clase)
soporte de formato para year
(especialización de plantilla de clase)
soporte de formato para weekday
(especialización de plantilla de clase)
soporte de formato para weekday_indexed
(especialización de plantilla de clase)
soporte de formato para weekday_last
(especialización de plantilla de clase)
soporte de formato para month_day
(especialización de plantilla de clase)
soporte de formato para month_day_last
(especialización de plantilla de clase)
soporte de formato para month_weekday
(especialización de plantilla de clase)
soporte de formato para month_weekday_last
(especialización de plantilla de clase)
soporte de formato para year_month
(especialización de plantilla de clase)
soporte de formato para year_month_day
(especialización de plantilla de clase)
soporte de formato para year_month_day_last
(especialización de plantilla de clase)
soporte de formato para year_month_weekday
(especialización de plantilla de clase)
soporte de formato para year_month_weekday_last
(especialización de plantilla de clase)
soporte de formato para hh_mm_ss
(especialización de plantilla de clase)
soporte de formato para sys_info
(especialización de plantilla de clase)
soporte de formato para local_info
(especialización de plantilla de clase)
soporte de formato para zoned_time
(especialización de plantilla de clase)
soporte de formato para basic_stacktrace
(especialización de plantilla de clase)
soporte de formato para stacktrace_entry
(especialización de plantilla de clase)
soporte de formato para thread::id
(especialización de plantilla de clase)
soporte de formato para vector<bool>::reference
(especialización de plantilla de clase)
soporte de formato para pair y tuple
(especialización de plantilla de clase)
soporte de formato para rangos
(especialización de plantilla de clase)
soporte de formato para std::stack
(especialización de plantilla de clase)
soporte de formato para std::queue
(especialización de plantilla de clase)
soporte de formato para std::priority_queue
(especialización de plantilla de clase)
soporte de formato para filesystem::path
(especialización de plantilla de clase)

Ejemplo

#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);
}

Salida:

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".

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 3944 C++23 algunas secuencias char eran formateables como rangos de wchar_t se deshabilitaron las especializaciones añadidas

Véase también

estado de formateo, incluyendo todos los argumentos de formateo y el iterador de salida
(plantilla de clase)
especifica que un tipo es formateable, es decir, especializa std::formatter y proporciona las funciones miembro parse y format
(concepto)
plantilla de clase que ayuda a implementar especializaciones de std::formatter para tipos de rango
(plantilla de clase)