Библиотека форматирования (начиная с C++20)
Библиотека форматирования текста предлагает безопасную и расширяемую альтернативу семейству функций printf. Она предназначена для дополнения существующей библиотеки потоков ввода-вывода C++.
Спецификации формата
Спецификация формата определяет, как форматируются объекты с использованием различных параметров.
Для форматирования объектов базовых типов и стандартных строковых типов используется базовая спецификация формата. Другие компоненты библиотеки также могут предоставлять собственные спецификации формата. Подробности см. здесь.
Функции форматирования
Определено в заголовке <format> |
|
|---|---|
|
(C++20) | сохраняет отформатированное представление аргументов в новой строке (шаблон функции) |
|
(C++20) | записывает отформатированное представление аргументов через выходной итератор (шаблон функции) |
|
(C++20) | записывает отформатированное представление аргументов через выходной итератор, не превышая заданный размер (шаблон функции) |
|
(C++20) | определяет количество символов, необходимых для хранения отформатированного представления аргументов (шаблон функции) |
Форматирующие строки
Определено в заголовке <format> |
|
|---|---|
|
(C++20)(C++20)(C++20) | шаблон класса, проверяющий форматирующие строки во время компиляции при создании объекта (шаблон класса) |
|
(C++26) | создаёт динамические форматирующие строки, которые можно напрямую использовать в функциях форматирования для пользовательского интерфейса (функция) |
Концепты форматирования
Определено в заголовке <format> |
|
|---|---|
|
(C++23) | задаёт, что тип является форматируемым, то есть специализирует std::formatter и предоставляет функции-члены parse и format (концепт) |
Поддержка расширяемости и детали реализации
Определено в заголовке <format> |
|
|---|---|
|
(C++20) | нетемплейтный вариант std::format с использованием стирания типа представления аргументов (функция) |
|
(C++20) | нетемплейтный вариант std::format_to с использованием стирания типа представления аргументов (шаблон функции) |
|
(C++20)(C++20) | создаёт объект со стёртым типом, ссылающийся на все аргументы форматирования и преобразуемый в format_args (шаблон функции) |
|
(C++20) (устарело в C++26) | интерфейс обхода аргументов для пользовательских форматтеров (шаблон функции) |
|
(C++20) | задаёт правила форматирования для указанного типа (шаблон класса) |
|
(C++23) | шаблон класса, упрощающий реализацию специализаций std::formatter для типов диапазонов (шаблон класса) |
|
(C++23) | указывает, что аргумент можно эффективно выводить (шаблон переменной) |
|
(C++23) | задаёт способ форматирования диапазона (перечисление) |
|
(C++23) | выбирает подходящий std::range_format для диапазона(шаблон переменной) |
|
(C++20) | шаблон класса, предоставляющий пользовательским форматтерам доступ к аргументу форматирования (шаблон класса) |
|
(C++20)(C++20)(C++20) | класс, предоставляющий доступ ко всем аргументам форматирования (шаблон класса) |
|
(C++20)(C++20)(C++20) | состояние форматирования, включая все аргументы форматирования и выходной итератор (шаблон класса) |
|
(C++20)(C++20)(C++20) | состояние анализатора форматирующей строки (шаблон класса) |
|
(C++20) | тип исключения, генерируемого при ошибках форматирования (класс) |
Вспомогательные элементы (начиная с 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; Поддержка типов, не форматируемых через const |
|
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) | Форматирующие строки времени выполнения | |
202603L | (C++26) | Переименование std::runtime_format в std::dynamic_format |
|
__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 | Применён к | Поведение согласно опубликованному стандарту | Исправленное поведение |
|---|---|---|---|
| P2418R2 | C++20 | объекты, которые нельзя форматировать через const и которые нельзя копировать (например, объекты, подобные генераторам), не являются форматируемыми | разрешить форматирование таких объектов (смягчить требования к форматтерам) |
| P2508R1 | C++20 | для этой возможности нет имени, доступного пользователю | имя basic_format_string становится доступным |
См. также
|
(C++23) | выводит в stdout или файловый поток отформатированное представление аргументов (шаблон функции) |
|
(C++23) | аналогично std::print, но после каждого вывода добавляется символ новой строки (шаблон функции) |
|
(C++23) | выводит отформатированное представление аргументов (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/format