Библиотека форматирования (C++20)
Материал из cppreference.com
Библиотека форматирования текста предлагает безопасную и расширяемую альтернативу семейству функций printf. Она предназначена для дополнения существующей библиотеки потоков ввода-вывода C++ и повторного использования некоторых элементов её инфраструктуры, таких как перегруженные операторы вставки для определяемых пользователем типов.
Запустить этот код
#include <format>
#include <cassert>
int main() {
std::string message = std::format("Ответ {}.", 42);
assert( message == "Ответ 42." );
}
Функции форматирования
Определены в заголовочном файле
<format> | |
(C++20) |
сохраняет форматированное представление аргументов в новой строке (шаблон функции) |
(C++20) |
записывает форматированное представление своих аргументов через итератор вывода (шаблон функции) |
(C++20) |
записывает форматированное представление своих аргументов через итератор вывода, не превышая заданного размера (шаблон функции) |
(C++20) |
определяет количество символов, необходимых для хранения форматированного представления его аргументов (шаблон функции) |
Концепты форматирования
Определены в заголовочном файле
<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) |
выбирает подходящий 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++20)(C++20) |
состояние парсера строки форматирования (шаблон класса) |
(C++20) |
тип исключения, возникающий при ошибках форматирования (класс) |
Примечание
| Макрос тест функциональности | |||
|---|---|---|---|
__cpp_lib_format |
201907L |
(C++20) | Форматирование текста |
202106L |
(C++20) | Проверка строки формата во время компиляции; Уменьшение параметризации std::vformat_to | |
202110L |
(C++20) | Исправление обработки локали в chrono форматтерах; Поддержка неконстантных форматируемых типов | |
202207L |
(C++23) | Раскрытие std::basic_format_string; Уточняет обработку кодировок в локализованном форматировании хронотипов | |
202304L |
(C++26) | Форматирование указателей | |
202305L |
(C++26) | Формат проверки типов аргументов | |
202306L |
(C++26) | Элемент std::basic_format_arg::visit
| |
__cpp_lib_format_ranges |
202207L |
(C++23) | Диапазоны форматирования |
Мы намеренно рассматриваем добавление std::basic_format_string (P2508) как сообщение о дефекте, потому что все известные реализации делают эти компоненты доступными в режиме C++20, хотя они не относятся к такой категории официально.
Пример
Запустить этот код
#include <cassert>
#include <format>
int main()
{
std::string message = std::format("Ответ {}.", 42);
assert( message == "Ответ 42." );
}
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| WG не указан | C++20 | объекты, которые не являются ни константно-форматируемыми, ни копируемыми (например, объекты, подобные генератору), не форматируются |
разрешено форматирование этих объектов (смягчены требования форматирования) |
| WG не указан | C++20 | для этого средства нет видимого пользователем имени | представлено имя basic_format_string
|
Смотрите также
(C++23) |
печатает в stdout или в файловый поток, используя форматированное представление аргументов (шаблон функции) |
(C++23) |
то же, что и std::print, за исключением того, что каждая печать заканчивается дополнительной новой строкой (шаблон функции) |
(C++23) |
выводит форматированное представление аргументов (шаблон функции) |