std::range_formatter
Определён в заголовочном файле <format> | ||
|---|---|---|
template< class T, class CharT = char >
requires std::same_as<std::remove_cvref_t<T>, T> && std::formattable<T, CharT>
class range_formatter;
| (начиная с C++23) |
std::range_formatter — вспомогательный шаблон класса для реализации специализаций std::formatter.
Спецификация форматирования диапазона
Синтаксис range-format-spec:
range-fill-and-align (необязательно) width (необязательно) n(необязательно) range-type (необязательно) range-underlying-spec (необязательно) |
range-fill-and-align интерпретируется так же, как fill-and-align, за исключением того, что fill в range-fill-and-align может быть любым символом, кроме {, } или :.
width описан в стандартной спецификации ширины формата.
Параметр n приводит к форматированию диапазона без открывающей и закрывающей скобок.
assert(std::format("{}", views::iota(1, 5)) == "[1, 2, 3, 4]");
assert(std::format("{:n}", views::iota(1, 5)) == "1, 2, 3, 4");
format-spec в range-underlying-spec (его синтаксис эквивалентен : format-spec), если он есть, интерпретируется форматтером элементов диапазона 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_");
range-type изменяет способ форматирования диапазона; некоторые параметры допустимы только для определённых типов аргументов.
Доступны следующие типы представления диапазона:
-
m: указывает, что открывающая скобка должна быть"{", закрывающая скобка должна быть"}", разделитель должен быть", ", а каждый элемент диапазона должен форматироваться так, как если бы для его tuple-type было указаноm(в tuple-format-spec). - Если в качестве range-type выбран
m, программа некорректна, еслиTне является специализацией одного из следующих типов: -
std::pair, или -
std::tuple, для которогоstd::tuple_size_v<T> == 2имеет значениеtrue.
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: указывает, что диапазон следует форматировать как строку. -
?s: указывает, что диапазон следует форматировать как экранированную строку. - Если в качестве range-type выбран
sили?s, в спецификатор формата не следует включать ни параметрn, ни range-underlying-spec, и - программа некорректна, если
Tне имеет значенияCharT.
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\"");
Члены-данные
| Имя члена | Определение |
|---|---|
std::formatter<T,CharT> underlying_ (закрытый) | форматтер элементов (объект-член, используемый только для описания) |
std::basic_string_view<CharT> separator_ (закрытый) | строка, представляющая разделитель результата форматирования диапазона. Разделитель по умолчанию — ", ".(объект-член, используемый только для описания) |
std::basic_string_view<CharT> opening-bracket_ (закрытый) | строка, представляющая открывающую скобку результата форматирования диапазона. Открывающая скобка по умолчанию — "[".(объект-член, используемый только для описания) |
std::basic_string_view<CharT> closing-bracket_ (закрытый) | строка, представляющая закрывающую скобку результата форматирования диапазона. Закрывающая скобка по умолчанию — "]".(объект-член, используемый только для описания) |
Функции-члены
|
set_separator | задаёт разделитель результата форматирования диапазона (открытая функция-член) |
|
set_brackets | задаёт открывающую и закрывающую скобки результата форматирования диапазона (открытая функция-член) |
|
underlying | возвращает базовый форматтер (открытая функция-член) |
|
parse | разбирает спецификатор формата в соответствии с range-format-spec (открытая функция-член) |
|
format | записывает отформатированный диапазон в соответствии с range-format-spec (открытая функция-член) |
std::range_formatter::set_separator
constexpr void set_separator( std::basic_string_view<CharT> sep ) noexcept; |
Присваивает sep значению separator_.
std::range_formatter::set_brackets
constexpr void set_brackets( std::basic_string_view<CharT> opening,
std::basic_string_view<CharT> closing ) noexcept;
|
Присваивает opening и closing значения opening-bracket_ и closing-bracket_ соответственно.
std::range_formatter::underlying
constexpr std::formatter<T, CharT>& underlying(); | (1) | |
constexpr const std::formatter<T, CharT>& underlying() const; | (2) |
Возвращает underlying_ (базовый форматтер).
std::range_formatter::parse
template< class ParseContext > constexpr auto parse( ParseContext& ctx ) -> ParseContext::iterator; |
Разбирает спецификаторы формата как range-format-spec и сохраняет разобранные спецификаторы в текущем объекте.
Вызывает underlying_.parse(ctx) для разбора format-spec в range-format-spec или, если последний отсутствует, пустого format-spec.
Если присутствует range-type или параметр n, значения opening-bracket_, closing-bracket_ и separator_ изменяются соответствующим образом.
Вызывает underlying_.set_debug_format(), если:
- range-type не равен ни
s, ни?s, -
underlying_.set_debug_format()является допустимым выражением, и - отсутствует range-underlying-spec.
Возвращает итератор, указывающий за конец range-format-spec.
std::range_formatter::format
template< ranges::input_range R, class FormatContext >
requires std::formattable<ranges::range_reference_t<R>, CharT> &&
std::same_as<std::remove_cvref_t<ranges::range_reference_t<R>>, T>
auto format( R&& r, FormatContext& ctx ) const -> FormatContext::iterator;
|
Если range-type равен s или ?s, записывает отформатированный std::basic_string<CharT>(std::from_range, r) как строку или экранированную строку соответственно в ctx.out().
В противном случае записывает в ctx.out() следующее в порядке, заданном range-format-spec:
-
opening-bracket_, - для каждого форматируемого элемента
eдиапазонаr: - результат записи
eпосредствомunderlying_, и -
separator_, если толькоeне является последним элементомr, и -
closing-bracket_.
Возвращает итератор, указывающий за конец выходного диапазона.
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Исправленное поведение |
|---|---|---|---|
| LWG 3892 | C++23 | форматирование вложенных диапазонов было некорректным | исправлено |
См. также
|
(C++20) | задаёт правила форматирования для указанного типа (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/format/range_formatter