std:: range_formatter
|
Definiert im Header
<format>
|
||
|
template
<
class
T,
class
CharT
=
char
>
requires
std::
same_as
<
std::
remove_cvref_t
<
T
>
, T
>
&&
std::
formattable
<
T, CharT
>
|
(seit C++23) | |
std::range_formatter
ist eine Hilfsklassen-Vorlage zur Implementierung von Bereichs-
std::formatter
Spezialisierungen.
Inhaltsverzeichnis |
Bereichsformat-Spezifikation
Die Syntax von range-format-spec lautet:
range-fill-and-align
(optional)
width
(optional)
n
(optional)
range-type
(optional)
range-underlying-spec
(optional)
|
|||||||||
Das
range-fill-and-align
wird auf die gleiche Weise interpretiert wie ein
fill-and-align
, mit der Ausnahme, dass das
fill
in
range-fill-and-align
ein beliebiges Zeichen außer
{
,
}
oder
:
ist.
Die width wird in der standard format width specification beschrieben.
Die
n
Option bewirkt, dass der Bereich ohne die öffnenden und schließenden Klammern formatiert wird.
assert(std::format("{}", views::iota(1, 5)) == "[1, 2, 3, 4]"); assert(std::format("{:n}", views::iota(1, 5)) == "1, 2, 3, 4");
Das
format-spec
in einem
range-underlying-spec
(seine Syntax entspricht
:
format-spec
), falls vorhanden, wird durch den Bereichselement-Formatierer
std::formatter<T, CharT>
interpretiert.
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_");
Der range-type ändert die Art und Weise, wie ein Bereich formatiert wird, wobei bestimmte Optionen nur mit bestimmten Argumenttypen gültig sind.
Die verfügbaren Bereichsdarstellungstypen sind:
-
m: Gibt an, dass die öffnende Klammer "{" sein soll, die schließende Klammer "}" sein soll, das Trennzeichen ", " sein soll und jedes Bereichselement so formatiert werden soll, als obmfür seinen tuple-type angegeben wurde (in tuple-format-spec ).
-
-
Wenn
mals der range-type gewählt wird, ist das Programm fehlerhaft, es sei denn,Tist entweder eine Spezialisierung von:
-
- std::pair , oder
- std::tuple , sodass std:: tuple_size_v < T > == 2 true ist.
-
Wenn
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: Gibt an, dass der Bereich als String formatiert werden soll. -
?s: Gibt an, dass der Bereich als escaped string formatiert werden soll.
-
-
Wenn
soder?sals range-type gewählt wird, dürfen sowohl dien-Option als auch range-underlying-spec nicht im Formatbezeichner enthalten sein, und -
das Programm ist fehlerhaft, es sei denn,
TistCharT.
-
Wenn
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\"");
Datenmitglieder
| Member name | Definition |
std::
formatter
<
T, CharT
>
underlying_
(private)
|
der zugrunde liegende Formatter für Elemente
( exposition-only member object* ) |
std::
basic_string_view
<
CharT
>
separator_
(private)
|
eine Zeichenkette, die den Separator des formatierten Bereichsergebnisses darstellt. Der Standardseparator ist
", "
.
( exposition-only member object* ) |
std::
basic_string_view
<
CharT
>
opening-bracket_
(private)
|
eine Zeichenkette, die die öffnende Klammer des formatierten Bereichsergebnisses darstellt. Die Standard-öffnende Klammer ist
"["
.
( exposition-only member object* ) |
std::
basic_string_view
<
CharT
>
closing-bracket_
(private)
|
eine Zeichenkette, die die schließende Klammer des formatierten Bereichsergebnisses darstellt. Die Standard-schließende Klammer ist
"]"
.
( exposition-only member object* ) |
Memberfunktionen
|
set_separator
|
setzt einen bestimmten Separator für das formatierte Bereichsergebnis
(public member function) |
|
set_brackets
|
setzt bestimmte öffnende und schließende Klammern für das formatierte Bereichsergebnis
(public member function) |
|
underlying
|
gibt den zugrundeliegenden Formatter zurück
(public member function) |
|
parse
|
parst den Formatbezeichner wie in
range-format-spec
angegeben
(public member function) |
|
format
|
schreibt die formatierte Bereichsausgabe wie in
range-format-spec
angegeben
(public member function) |
std::range_formatter:: set_separator
|
constexpr
void
set_separator
(
std::
basic_string_view
<
CharT
>
sep
)
noexcept
;
|
||
Weist
sep
dem
separator_
zu.
std::range_formatter:: set_brackets
|
constexpr
void
set_brackets
(
std::
basic_string_view
<
CharT
>
opening,
std:: basic_string_view < CharT > closing ) noexcept ; |
||
Weist
opening
und
closing
jeweils
opening-bracket_
und
closing-bracket_
zu.
std::range_formatter:: underlying
|
constexpr
std::
formatter
<
T, CharT
>
&
underlying
(
)
;
|
(1) | |
|
constexpr
const
std::
formatter
<
T, CharT
>
&
underlying
(
)
const
;
|
(2) | |
Gibt
underlying_
(den zugrunde liegenden Formatierer) zurück.
std::range_formatter:: parse
|
template
<
class
ParseContext
>
constexpr auto parse ( ParseContext & ctx ) - > ParseContext :: iterator ; |
||
Parst die Formatbezeichner als range-format-spec und speichert die geparsten Bezeichner im aktuellen Objekt.
Ruft
underlying_
.
parse
(
ctx
)
auf, um
format-spec
in
range-format-spec
zu parsen oder, falls letzteres nicht vorhanden ist, einen leeren
format-spec
.
Falls
range-type
oder die
n
-Option vorhanden sind, werden die Werte von
opening-bracket_
,
closing-bracket_
und
separator_
entsprechend angepasst.
Es ruft
underlying_
.
set_debug_format
(
)
auf, wenn:
-
der
range-type
weder
snoch?sist, -
underlying_. set_debug_format ( ) ein gültiger Ausdruck ist, und - kein range-underlying-spec vorhanden ist.
Gibt einen Iterator zurück, der hinter das Ende des range-format-spec zeigt.
std::range_formatter:: format
|
template
<
ranges::
input_range
R,
class
FormatContext
>
requires
std::
formattable
<
ranges::
range_reference_t
<
R
>
, CharT
>
&&
|
||
Wenn der
range-type
entweder
s
oder
?s
war, schreibt es den formatierten
std::
basic_string
<
CharT
>
(
std::
from_range
, r
)
als String bzw. als escaped String in
ctx.
out
(
)
.
Andernfalls schreibt es Folgendes in ctx. out ( ) gemäß range-format-spec in dieser Reihenfolge:
-
opening-bracket_, - für jedes formatierbare Element e des Ranges r :
-
-
das Ergebnis des Schreibens von
e
über
underlying_, und -
separator_, außer e ist das letzte Element von r , und
-
das Ergebnis des Schreibens von
e
über
-
closing-bracket_.
Gibt einen Iterator hinter das Ende des Ausgabebereichs zurück.
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Veröffentlichtes Verhalten | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3892 | C++23 | die Formatierung verschachtelter Bereiche war fehlerhaft | korrigiert |
Siehe auch
|
(C++20)
|
definiert Formatierungsregeln für einen gegebenen Typ
(Klassentemplate) |