Spec-Zone.ru › C++

Библиотека форматирования (начиная с C++20)

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

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

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

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

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

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

Форматирующие строки

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

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

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

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

Определено в заголовке <format>
vformat
(C++20)
нетемплейтный вариант std::format с использованием стирания типа представления аргументов
(функция)
vformat_to
(C++20)
нетемплейтный вариант std::format_to с использованием стирания типа представления аргументов
(шаблон функции)
make_format_argsmake_wformat_args
(C++20)(C++20)
создаёт объект со стёртым типом, ссылающийся на все аргументы форматирования и преобразуемый в format_args
(шаблон функции)
visit_format_arg
(C++20) (устарело в C++26)
интерфейс обхода аргументов для пользовательских форматтеров
(шаблон функции)
formatter
(C++20)
задаёт правила форматирования для указанного типа
(шаблон класса)
range_formatter
(C++23)
шаблон класса, упрощающий реализацию специализаций std::formatter для типов диапазонов
(шаблон класса)
enable_nonlocking_formatter_optimization
(C++23)
указывает, что аргумент можно эффективно выводить
(шаблон переменной)
range_format
(C++23)
задаёт способ форматирования диапазона
(перечисление)
format_kind
(C++23)
выбирает подходящий std::range_format для диапазона
(шаблон переменной)
basic_format_arg
(C++20)
шаблон класса, предоставляющий пользовательским форматтерам доступ к аргументу форматирования
(шаблон класса)
basic_format_argsformat_argswformat_args
(C++20)(C++20)(C++20)
класс, предоставляющий доступ ко всем аргументам форматирования
(шаблон класса)
basic_format_contextformat_contextwformat_context
(C++20)(C++20)(C++20)
состояние форматирования, включая все аргументы форматирования и выходной итератор
(шаблон класса)
basic_format_parse_contextformat_parse_contextwformat_parse_context
(C++20)(C++20)(C++20)
состояние анализатора форматирующей строки
(шаблон класса)
format_error
(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 становится доступным

См. также

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

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

Spec-Zone.ru

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