Namespaces
Variants

std:: format_to_n, std:: format_to_n_result

From cppreference.net
Определено в заголовочном файле <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 - объект, представляющий строку формата. Строка формата состоит из:
  • обычных символов (кроме { и } ), которые копируются в вывод без изменений,
  • escape-последовательностей { { и } } , которые заменяются на { и } соответственно в выводе, и
  • полей замены.

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

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

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

format-spec - спецификация формата, определяемая специализацией std::formatter для соответствующего аргумента. Не может начинаться с } .

(since C++23)
(since 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 Applied to Behavior as published Correct behavior
P2216R3 C++20 throws std::format_error for invalid format string invalid format string results in compile-time error
P2418R2 C++20 objects that are neither const-usable nor copyable
(such as generator-like objects) are not formattable
allow formatting these objects
P2508R1 C++20 there's no user-visible name for this facility the name basic_format_string is exposed

Смотрите также

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