Spec-Zone.ru › C++

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.

5) std::format_to_n_result не имеет базовых классов и членов, кроме out, size и неявно объявленных специальных функций-членов.

Параметры

out - итератор выходного буфера
n - максимальное количество символов, которые будут записаны в буфер
fmt - объект, представляющий строку формата. Строка формата состоит из
  • обычных символов (кроме { и }), которые без изменений копируются в выходные данные,
  • последовательностей экранирования {{ и }}, которые заменяются в выходных данных соответственно на { и }, а также
  • полей подстановки.

Каждое поле подстановки имеет следующий формат:

{ arg-id (необязательно) } (1)
{ arg-id (необязательно) : format-spec } (2)
1) поле подстановки без спецификации формата 2) поле подстановки со спецификацией формата
arg-id - задает индекс аргумента в args, значение которого используется для форматирования; если он не указан, аргументы используются по порядку.

Либо все arg-id в строке формата должны быть указаны, либо все они должны быть опущены. Смешивание ручной и автоматической индексации приводит к ошибке.

format-spec - спецификация формата, определенная специализацией std::formatter для соответствующего аргумента. Не может начинаться с }.
  • Для базовых типов и стандартных строковых типов спецификация формата интерпретируется как стандартная спецификация формата.
  • Для типов chrono спецификация формата интерпретируется как спецификация формата chrono.
  • Для типов-диапазонов спецификация формата интерпретируется как спецификация формата диапазона.
  • Для std::pair и std::tuple спецификация формата интерпретируется как спецификация формата кортежа.
  • Для std::thread::id и std::stacktrace_entry см. спецификацию формата идентификатора потока и спецификацию формата записи трассировки стека.
  • Для std::basic_stacktrace спецификатор формата не допускается.
(начиная с C++23)
  • Для std::filesystem::path см. спецификацию формата пути.
(начиная с C++26)
  • Для других форматируемых типов спецификация формата определяется пользовательскими специализациями formatter.
args... - аргументы для форматирования
loc - std::locale, используемый для форматирования с учетом локали

Возвращаемое значение

Объект format_to_n_result, у которого член out является итератором, указывающим за конец выходного диапазона, а член size содержит общий размер выходных данных (без усечения).

Исключения

Передает любое исключение, возникшее при операциях форматтера или итератора.

Примечания

В реализации libstdc++ до GCC-13.3 была ошибка при указании правильного значения format_to_n_result::out.

Пример

В Compiler Explorer от Godbolt: clang (trunk) + libc++, GCC (trunk) + libstdc++.

#include <format>
#include <initializer_list>
#include <iomanip>
#include <iostream>
#include <string_view>

int main()
{
    char buffer[64];

    for (std::size_t max_chars_to_write : {std::size(buffer) - 1, 23uz, 21uz})
    {
        const std::format_to_n_result result =
            std::format_to_n(
                buffer, max_chars_to_write,
                "Hubble's H{2} {3} {0}{4}{1} km/sec/Mpc.", // 24 bytes w/o formatters
                71,       // {0}, occupies 2 bytes
                8,        // {1}, occupies 1 byte
                "\u2080", // {2}, occupies 3 bytes, '₀' (SUBSCRIPT ZERO)
                "\u2245", // {3}, occupies 3 bytes, '≅' (APPROXIMATELY EQUAL TO)
                "\u00B1"  // {4}, occupies 2 bytes, '±' (PLUS-MINUS SIGN)
                ); // 24 + 2 + 1 + 3 + 3 + 2 == 35, no trailing '\0'

        *result.out = '\0'; // adds terminator to buffer

        const std::string_view str(buffer, result.out);

        std::cout << "Buffer until '\\0': " << std::quoted(str) << '\n'
                  << "Max chars to write: " << max_chars_to_write << '\n'
                  << "result.out offset: " << result.out - buffer << '\n'
                  << "Untruncated output size: " << result.size << "\n\n";
    }
}

Вывод:

Buffer until '\0': "Hubble's H₀ ≅ 71±8 km/sec/Mpc."
Max chars to write: 63
result.out offset: 35
Untruncated output size: 35

Buffer until '\0': "Hubble's H₀ ≅ 71±8"
Max chars to write: 23
result.out offset: 23
Untruncated output size: 35

Buffer until '\0': "Hubble's H₀ ≅ 71�"
Max chars to write: 21
result.out offset: 21
Untruncated output size: 35

Отчеты об ошибках стандарта

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

DR Применяется к Поведение согласно опубликованной версии Правильное поведение
P2216R3 C++20 при некорректной строке формата выбрасывает std::format_error некорректная строка формата приводит к ошибке времени компиляции
P2418R2 C++20 объекты, которые нельзя использовать как константные и которые нельзя копировать
(например, объекты, подобные генераторам), не являются форматируемыми
разрешено форматирование таких объектов
P2508R1 C++20 для этой возможности нет имени, доступного пользователю имя basic_format_string становится доступным

См. также

format
(C++20)
сохраняет отформатированное представление аргументов в новой строке
(шаблон функции)
format_to
(C++20)
записывает отформатированное представление аргументов с помощью выходного итератора
(шаблон функции)
formatted_size
(C++20)
определяет количество символов, необходимое для хранения отформатированного представления аргументов
(шаблон функции)

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

Spec-Zone.ru

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