std::format_to_n, std::format_to_n_result
Определено в заголовочном файле <format>
|
||
template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> |
(1) | (начиная с C++20) |
template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> |
(2) | (начиная с C++20) |
template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> |
(3) | (начиная с C++20) |
template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> |
(4) | (начиная с C++20) |
Вспомогательные типы |
||
template< class OutputIt > struct format_to_n_result { |
(5) | (начиная с C++20) |
Форматирует args
в соответствии со строкой формата fmt
и записывает результат в итератор вывода out
. Записывается не более n
символов. Если присутствует, loc
используется для форматирования, зависящего от локали.
Пусть CharT
будет char для перегрузок (1,3), wchar_t для перегрузок (2,4).
Эти перегрузки участвуют в разрешении перегрузки, только если
OutputIt
соответствует концепту std::output_iterator<const CharT&>.
Поведение не определено, если OutputIt
не моделирует (не отвечает семантическим требованиям) концепт std::output_iterator<const CharT&> или если std::formatter<std::remove_cvref_t<Ti>, CharT> не соответствует требованиям BasicFormatter для любого Ti
в Args
.
std::format_to_n_result
не имеет базовых классов или элементов, кроме out
, size
и неявно объявленных специальных функций-элементов.Содержание |
[править] Параметры
out | — | итератор выходного буфера | ||||||||||||||||||||||||||||||||||||||||||
n | — | максимальное количество символов, записываемых в буфер | ||||||||||||||||||||||||||||||||||||||||||
fmt | — |
Каждое поле замены имеет следующий формат:
1) поле замены без указания формата
2) поле замены со спецификацией формата
| ||||||||||||||||||||||||||||||||||||||||||
args... | — | аргументы для форматирования | ||||||||||||||||||||||||||||||||||||||||||
loc | — | std::locale используется для форматирования, зависящего от локали |
[править] Возвращаемое значение
format_to_n_result
, такое, что элемент out
является итератором за концом выходного диапазона, а элемент size
представляет собой общий (не усечённый) размер вывода.
[править] Исключения
Распространяет любые исключения, возникающие в результате операций форматирования или итерирования.
[править] Пример
В Обозревателе Компиляторов Godbolt: clang (trunk) + libc++, gcc (trunk) + libstdc++.
#include <format> #include <iostream> #include <string_view> int main() { char buffer[64]; for (std::size_t max_chars_to_write : {std::size(buffer) - 1, 23uz}) { const auto result = std::format_to_n( buffer, max_chars_to_write, "Hubble's H{2} {3} {0}{4}{1} км/сек/Mpc.", // 24 байта без форматтеров 71, // {0}, занимает 2 байта 8, // {1}, занимает 1 байт "\u2080", // {2}, занимает 3 байта, '₀' (SUBSCRIPT ZERO) "\u2245", // {3}, занимает 3 байта, '≅' (APPROXIMATELY EQUAL TO) "\u00B1" // {4}, занимает 2 байта, '±' (PLUS-MINUS SIGN) ); // 24 + 2 + 1 + 3 + 3 + 2 == 35, без завершающего '\0' *result.out = '\0'; // добавляет терминатор в буфер const std::string_view str{buffer, result.out}; // использует конструктор C++20 std::cout << "Буфер до '\\0': \"" << str << "\"\n" << "Максимальное количество символов для записи: " << max_chars_to_write << '\n' << "Смещение result.out: " << result.out - buffer << '\n' << "Необрезанный размер вывода: " << result.size << "\n\n"; } }
Вывод:
Буфер до '\0': "Hubble's H₀ ≅ 71±8 км/сек/Mpc." Максимальное количество символов для записи: 63 Смещение result.out: 35 Необрезанный размер вывода: 35 Буфер до '\0': "Hubble's H₀ ≅ 71±8" Максимальное количество символов для записи: 23 Смещение result.out: 23 Необрезанный размер вывода: 35
[править] Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
WG не указан | C++20 | генерирует std::format_error для неверной строки формата | неверная строка формата приводит к ошибке времени компиляции |
WG не указан | C++20 | объекты, которые не являются ни константными, ни копируемыми (например, объекты, подобные генераторам), не форматируются |
разрешено форматирование этих объектов |
WG не указан | C++20 | для этого средства нет видимого пользователем имени | представлено имя basic_format_string
|
[править] Смотрите также
(C++20) |
сохраняет форматированное представление аргументов в новой строке (шаблон функции) |
(C++20) |
записывает форматированное представление своих аргументов через итератор вывода (шаблон функции) |
(C++20) |
определяет количество символов, необходимых для хранения форматированного представления его аргументов (шаблон функции) |