Namespaces
Variants

Formatting library (since C++20)

From cppreference.net

Библиотека форматирования текста предлагает безопасную и расширяемую альтернативу семейству функций printf. Она предназначена для дополнения существующей библиотеки потоков ввода-вывода C++.

Содержание

Спецификации формата

Спецификация формата определяет, как объекты форматируются с различными видами опций.

Форматирование объектов базовых типов и стандартных строковых типов использует базовую спецификацию формата . Другие компоненты библиотеки также могут предоставлять собственные спецификации формата, подробности смотрите здесь .

Функции форматирования

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

Строки формата

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

Концепции форматирования

Определено в заголовочном файле <format>
указывает, что тип является форматируемым, то есть специализирует std::formatter и предоставляет функции-члены parse и format
(концепт)

Поддержка расширяемости и детали реализации

Определено в заголовочном файле <format>
(C++20)
нетемплейтный вариант std::format с использованием стирания типов для представления аргументов
(функция)
(C++20)
нетемплейтный вариант std::format_to с использованием стирания типов для представления аргументов
(функция-шаблон)
создает объект со стиранием типов, ссылающийся на все аргументы форматирования, конвертируемый в format_args
(функция-шаблон)
(C++20) (устарело в C++26)
интерфейс посещения аргументов для пользовательских форматтеров
(функция-шаблон)
(C++20)
определяет правила форматирования для заданного типа
(класс-шаблон)
класс-шаблон, помогающий реализовывать специализации std::formatter для типов диапазонов
(класс-шаблон)
указывает, что тип аргумента может быть эффективно выведен
(переменная-шаблон)
определяет, как должен форматироваться диапазон
(перечисление)
выбирает подходящий std::range_format для диапазона
(переменная-шаблон)
класс-шаблон, предоставляющий доступ к аргументу форматирования для пользовательских форматтеров
(класс-шаблон)
класс, предоставляющий доступ ко всем аргументам форматирования
(класс-шаблон)
состояние форматирования, включая все аргументы форматирования и выходной итератор
(класс-шаблон)
состояние парсера строки форматирования
(класс-шаблон)
тип исключения, выбрасываемого при ошибках форматирования
(класс)

Вспомогательные элементы (since C++23)

template < class R, class CharT >

concept /*const-formattable-range*/ =
ranges:: input_range < const R > &&

std:: formattable < ranges:: range_reference_t < const R > , CharT > ;
(1) ( только для демонстрации* )
template < class R, class CharT >

using /*fmt-maybe-const*/ =

std:: conditional_t < /*const-formattable-range*/ < R, CharT > , const R, R > ;
(2) ( только для демонстрации* )

Примечания

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_format 201907L (C++20) Форматирование текста
202106L (C++23)
(DR20)
Проверки строки формата на этапе компиляции;
Уменьшение параметризации std::vformat_to
202110L (C++23)
(DR20)
Исправление обработки локали в форматтерах chrono;
Поддержка типов, не являющихся константно-форматируемыми
202207L (C++23)
(DR20)
Предоставление std::basic_format_string ;
Уточнение обработки кодировок при локализованном форматировании типов chrono
202304L (C++26) Форматирование указателей
202305L (C++26) Проверка типов аргументов формата
202306L (C++26) Функция-член std::basic_format_arg::visit
202311L (C++26) Строка формата времени выполнения
202403L (C++26) Вывод пустых строк с помощью std::println
202403L (C++26)
(DR23)
Разрешение эффективной реализации std::print
__cpp_lib_format_ranges 202207L (C++23) Форматирование диапазонов
__cpp_lib_format_path 202403L (C++26) Форматирование std::filesystem::path
__cpp_lib_format_uchar 202311L (C++26) Исправление форматирования кодовых единиц как целых чисел
__cpp_lib_formatters 202302L (C++23) Форматирование std::thread::id и std::stacktrace

Мы намеренно рассматриваем добавление std::basic_format_string ( P2508 ) как отчёт о дефекте, поскольку все известные реализации делают эти компоненты доступными в режиме C++20, хотя официально это не классифицируется таким образом.

Пример

#include <cassert>
#include <format>
int main()
{
    std::string message = std::format("The answer is {}.", 42);
    assert(message == "The answer is 42.");
}

Отчёты о дефектах

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

DR Applied to Behavior as published Correct behavior
P2418R2 C++20 объекты, которые не являются ни константно-форматируемыми, ни копируемыми
(такие как генератороподобные объекты) не являются форматируемыми
разрешить форматирование этих объектов
(ослабленные требования к форматтерам)
P2508R1 C++20 нет пользовательского имени для этого механизма имя basic_format_string становится доступным

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

(C++23)
выводит в stdout или файловый поток с использованием форматированного представления аргументов
(шаблон функции)
(C++23)
то же, что и std::print за исключением того, что каждый вывод завершается дополнительным переводом строки
(шаблон функции)
выводит форматированное представление аргументов
(шаблон функции)