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::formatter для типов диапазонов.
Спецификация формата диапазона
Синтаксис range-format-spec:
range-fill-and-align (необязательно) ширина (необязательно) n(необязательно) тип-диапазона (необязательно) range-underlying-spec (необязательно) |
range-fill-and-align интерпретируется так же, как и fill-and-align, за исключением того, что fill в range-fill-and-align — это любой символ, кроме {, }, или :.
ширина описана в стандартной спецификации ширины формата.
Опция n приводит к форматированию диапазона без открывающей и закрывающей скобок.
format-spec в range-underlying-spec (его синтаксис эквивалентен : format-spec), если указано, интерпретируется форматировщиком элемента диапазона std::formatter<T, CharT>.
тип-диапазона изменяет способ форматирования диапазона, при этом определенные опции допустимы только с определёнными типами аргументов.
Доступные типы представления диапазонов:
-
m: Указывает, что открывающая скобка должна быть"{", закрывающая скобка должна быть"}", разделитель должен быть", ", а каждый элемент диапазона должен форматироваться так, как если быmбыл указан для его tuple-type (в tuple-format-spec). - Если
mвыбрано как тип-диапазона, программа некорректна, еслиTявляется специализацией: -
std::pair, или -
std::tupleтаким образом, чтоstd::tuple_size_v<T> == 2являетсяtrue. -
s: Указывает, что диапазон должен форматироваться как строка. -
?s: Указывает, что диапазон должен форматироваться как экранированная строка. - Если
sили?sвыбрано как тип-диапазона, обе опцииnи range-underlying-spec не должны быть включены в спецификатор формата, и - программа некорректна, если
TявляетсяCharT.
Члены-объекты
| Название члена | Определение |
|---|---|
underlying_ (приватный) | базовый форматировщик типа std::formatter<T, CharT>(экспозиционный член-объект*) |
separator_ (приватный) | строка, представляющая разделитель отформатированного результата диапазона (значение по умолчанию — ", ")(экспозиционный член-объект*) |
opening-bracket_ (приватный) | строка, представляющая открывающую скобку отформатированного результата диапазона (значение по умолчанию — "[")(экспозиционный член-объект*) |
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 ) -> typename ParseContext::iterator; |
Анализирует спецификаторы формата как range-format-spec и сохраняет проанализированные спецификаторы в текущем объекте.
Вызывает underlying_.parse(ctx) для анализа format-spec в range-format-spec или, если последняя не присутствует, пустого format-spec.
Если тип-диапазона или опция n присутствуют, значения opening-bracket, closing-bracket, и separator изменяются по мере необходимости.
Вызывает underlying_.set_debug_format() если:
- тип-диапазона не является
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 -> typename FormatContext::iterator;
|
Если тип-диапазона был либо s или ?s, соответственно записывает отформатированный std::basic_string<CharT>(std::from_range, r) в ctx.out() как строку или экранированную строку.
В противном случае записывает следующее в ctx.out() в соответствии со range-format-spec, в порядке:
-
opening-bracket_, - для каждого форматируемого элемента
eдиапазонаr: - результат записи представления
eunderlying_, и -
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/w/cpp/utility/format/range_formatter