Spec-Zone.ru › C++

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:
    • результат записи представления e underlying_, и
    • separator_, если e не является последним элементом r,
  • closing-bracket_.

Возвращает итератор, следующий за концом выходного диапазона.

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

Отчёт об ошибке Применено к Поведение, опубликованное Корректное поведение
LWG 3892 C++23 неправильное форматирование вложенных диапазонов исправлено

См. также

formatter
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API