std:: formatter
|
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 :
- std::is_default_constructible_v
- std::is_copy_constructible_v
- std::is_move_constructible_v
- std::is_copy_assignable_v
- std::is_move_assignable_v .
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 :
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
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
|
Esta sección está incompleta
Razón: La especificación de formato estándar se ha movido a una página separada . El título de la sección se conserva temporalmente para los enlaces a esta sección. Esta sección será eliminada después de que todos esos enlaces sean resueltos. |
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) |
|
|
(C++23)
|
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) |
|
|
(C++23)
|
soporte de formato para
pair
y
tuple
(especialización de plantilla de clase) |
|
(C++23)
|
soporte de formato para rangos
(especialización de plantilla de clase) |
|
(C++23)
|
soporte de formato para
std::stack
(especialización de plantilla de clase) |
|
(C++23)
|
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
|
(C++20)
(C++20)
(C++20)
|
estado de formateo, incluyendo todos los argumentos de formateo y el iterador de salida
(plantilla de clase) |
|
(C++23)
|
especifica que un tipo es formateable, es decir, especializa
std::formatter
y proporciona las funciones miembro
parse
y
format
(concepto) |
|
(C++23)
|
plantilla de clase que ayuda a implementar especializaciones de
std::formatter
para tipos de rango
(plantilla de clase) |