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::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 форматирование вложенных диапазонов было некорректным исправлено

См. также

formatter
(C++20)
задаёт правила форматирования для указанного типа
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/format/range_formatter

Spec-Zone.ru

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