std::format_to_n, std::format_to_n_result
| Определено в заголовочном файле <format>
|
||
template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> format_to_n( OutputIt out, std::iter_difference_t<OutputIt> n, std::format_string<Args...> fmt, Args&&... args ); |
(1) | (начиная с C++20) |
template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> format_to_n( OutputIt out, std::iter_difference_t<OutputIt> n, std::wformat_string<Args...> fmt, Args&&... args ); |
(2) | (начиная с C++20) |
template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> format_to_n( OutputIt out, std::iter_difference_t<OutputIt> n, const std::locale& loc, std::format_string<Args...> fmt, Args&&... args ); |
(3) | (начиная с C++20) |
template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> format_to_n( OutputIt out, std::iter_difference_t<OutputIt> n, const std::locale& loc, std::wformat_string<Args...> fmt, Args&&... args ); |
(4) | (начиная с C++20) |
| Вспомогательные типы |
||
template< class OutputIt > struct format_to_n_result { OutputIt out; std::iter_difference_t<OutputIt> size; }; |
(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) |
определяет количество символов, необходимых для хранения форматированного представления его аргументов (шаблон функции) |