std:: range_formatter
|
Definido en el encabezado
<format>
|
||
|
template
<
class
T,
class
CharT
=
char
>
requires
std::
same_as
<
std::
remove_cvref_t
<
T
>
, T
>
&&
std::
formattable
<
T, CharT
>
|
(desde C++23) | |
std::range_formatter
es una clase plantilla auxiliar para implementar especializaciones de formateadores de rangos
std::formatter
.
Contenidos |
Especificación de formato de rango
La sintaxis de range-format-spec es:
range-fill-and-align
(opcional)
width
(opcional)
n
(opcional)
range-type
(opcional)
range-underlying-spec
(opcional)
|
|||||||||
El
range-fill-and-align
se interpreta de la misma manera que un
fill-and-align
excepto que el
fill
en
range-fill-and-align
es cualquier carácter distinto de
{
,
}
, o
:
.
El width se describe en la especificación estándar de formato width .
La opción
n
hace que el rango se formatee sin los corchetes de apertura y cierre.
assert(std::format("{}", views::iota(1, 5)) == "[1, 2, 3, 4]"); assert(std::format("{:n}", views::iota(1, 5)) == "1, 2, 3, 4");
El
format-spec
en un
range-underlying-spec
(su sintaxis es equivalente a
:
format-spec
), si está presente, es interpretado por el formateador de elementos de rango
std::formatter<T, CharT>
.
std::array ints{12, 10, 15, 14}; assert(std::format("{}", ints) == "[12, 10, 15, 14]"); assert(std::format("{::X}", ints) == "[C, A, F, E]"); assert(std::format("{:n:_^4}", ints) == "_12_, _10_, _15_, _14_");
El range-type cambia la forma en que se formatea un rango, con ciertas opciones válidas únicamente con tipos de argumentos específicos.
Los tipos de presentación de rango disponibles son:
-
m: Indica que el corchete de apertura debe ser "{" , el corchete de cierre debe ser "}" , el separador debe ser ", " , y cada elemento del rango debe formatearse como simestuviera especificado para su tuple-type (en tuple-format-spec ).
-
-
Si
mse elige como el range-type , el programa está mal formado a menos queTsea una especialización de:
-
- std::pair , o
- std::tuple tal que std:: tuple_size_v < T > == 2 sea true .
-
Si
std::array char_pairs { std::pair{'A', 5}, std::pair{'B', 10}, std::pair{'C', 12} }; assert(std::format("{}", char_pairs) == "[('A', 5), ('B', 10), ('C', 12)]"); assert(std::format("{:m}", char_pairs) == "{'A': 5, 'B': 10, 'C': 12}");
-
s: Indica que el rango debe formatearse como una cadena. -
?s: Indica que el rango debe formatearse como una cadena escapada .
-
-
Si se elige
so?scomo el range-type , ni la opciónnni el range-underlying-spec deben incluirse en el especificador de formato, y -
el programa está mal formado a menos que
TseaCharT.
-
Si se elige
std::array star{'S', 'T', 'A', 'R'}; assert(std::format("{}", star) == "['S', 'T', 'A', 'R']"); assert(std::format("{:s}", star) == "STAR"); assert(std::format("{:?s}", star) == "\"STAR\"");
Miembros de datos
| Nombre del miembro | Definición |
std::
formatter
<
T, CharT
>
underlying_
(privado)
|
el formateador subyacente para elementos
( objeto miembro solo para exposición* ) |
std::
basic_string_view
<
CharT
>
separator_
(privado)
|
una cadena que representa el separador del resultado formateado del rango. El separador predeterminado es
", "
.
( objeto miembro solo para exposición* ) |
std::
basic_string_view
<
CharT
>
opening-bracket_
(privado)
|
una cadena que representa el corchete de apertura del resultado formateado del rango. El corchete de apertura predeterminado es
"["
.
( objeto miembro solo para exposición* ) |
std::
basic_string_view
<
CharT
>
closing-bracket_
(privado)
|
una cadena que representa el corchete de cierre del resultado formateado del rango. El corchete de cierre predeterminado es
"]"
.
( objeto miembro solo para exposición* ) |
Funciones miembro
|
set_separator
|
establece un separador específico para el resultado formateado del rango
(función de miembro pública) |
|
set_brackets
|
establece corchetes de apertura y cierre específicos para el resultado formateado del rango
(función de miembro pública) |
|
underlying
|
devuelve el formateador subyacente
(función de miembro pública) |
|
parse
|
analiza el especificador de formato según lo especificado por
range-format-spec
(función de miembro pública) |
|
format
|
escribe la salida formateada del rango según lo especificado por
range-format-spec
(función de miembro pública) |
std::range_formatter:: set_separator
|
constexpr
void
set_separator
(
std::
basic_string_view
<
CharT
>
sep
)
noexcept
;
|
||
Asigna
sep
a
separator_
.
std::range_formatter:: set_brackets
|
constexpr
void
set_brackets
(
std::
basic_string_view
<
CharT
>
opening,
std:: basic_string_view < CharT > closing ) noexcept ; |
||
Asigna
opening
y
closing
a
opening-bracket_
y
closing-bracket_
, respectivamente.
std::range_formatter:: underlying
|
constexpr
std::
formatter
<
T, CharT
>
&
underlying
(
)
;
|
(1) | |
|
constexpr
const
std::
formatter
<
T, CharT
>
&
underlying
(
)
const
;
|
(2) | |
Devuelve
underlying_
(el formateador subyacente).
std::range_formatter:: parse
|
template
<
class
ParseContext
>
constexpr auto parse ( ParseContext & ctx ) - > ParseContext :: iterator ; |
||
Analiza los especificadores de formato como un range-format-spec y almacena los especificadores analizados en el objeto actual.
Llama a
underlying_
.
parse
(
ctx
)
para analizar el
format-spec
en el
range-format-spec
o, si este último no está presente, un
format-spec
vacío.
Si está presente el
range-type
o la opción
n
, los valores de
opening-bracket_
,
closing-bracket_
, y
separator_
se modifican según sea necesario.
Llama a
underlying_
.
set_debug_format
(
)
si:
-
el
range-type
no es ni
sni?s, -
underlying_. set_debug_format ( ) es una expresión válida, y - no hay un range-underlying-spec .
Devuelve un iterador más allá del final del range-format-spec .
std::range_formatter:: format
|
template
<
ranges::
input_range
R,
class
FormatContext
>
requires
std::
formattable
<
ranges::
range_reference_t
<
R
>
, CharT
>
&&
|
||
Si el
tipo-de-rango
era
s
o
?s
, escribe el
std::
basic_string
<
CharT
>
(
std::
from_range
, r
)
formateado como una cadena o una cadena escapada, respectivamente, en
ctx.
out
(
)
.
De lo contrario, escribe lo siguiente en ctx. out ( ) según lo especificado por especificación-de-formato-de-rango , en orden:
-
corchete-de-apertura_, - para cada elemento formateable e del rango r :
-
-
el resultado de escribir
e
mediante
subyacente_, y -
separador_, a menos que e sea el último elemento de r , y
-
el resultado de escribir
e
mediante
-
corchete-de-cierre_.
Devuelve un iterador más allá del final del rango de salida.
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3892 | C++23 | el formato de rangos anidados era incorrecto | corregido |
Véase también
|
(C++20)
|
define las reglas de formato para un tipo dado
(plantilla de clase) |