fmt
Современная библиотека форматирования строк для C++, предоставляющая безопасную, расширяемую и высокопроизводительную альтернативу функциям стандартной библиотеки вроде printf и iostreams. Библиотека реализует предложение C++20 std::format и обеспечивает обратную совместимость с более старыми стандартами C++.
Особенности
- безопасность типов — ошибки форматирования обнаруживаются во время компиляции;
- высокая производительность — быстрее
printfи потоков C++ в большинстве сценариев; - поддержка C++11 и выше, включая полную реализацию C++20
std::format; - расширяемость для пользовательских типов;
- поддержка локалей и интернационализации;
- чистый и интуитивно понятный синтаксис.
Основные компоненты
fmt предоставляет богатый набор функций для форматирования строк, вывода и парсинга (подробнее с документацией можно ознакомиться здесь).
Базовое форматирование строк
Библиотека предоставляет безопасную и эффективную систему форматирования с использованием синтаксиса, похожего на Python. Форматные строки проверяются во время компиляции, что предотвращает многие распространенные ошибки.
Основные функции форматирования:
fmt::format()— форматирование строки с возвратом результата в виде строки;fmt::format_to()— форматирование с записью результата в выходной итератор;fmt::format_to_n()— форматирование с ограничением по количеству символов;fmt::formatted_size()— вычисление размера отформатированной строки без создания самой строки;fmt::print()— вывод форматированной строки в стандартный поток вывода.
Продвинутые возможности форматирования
fmt поддерживает сложные сценарии форматирования, включая позиционные и именованные аргументы, настраиваемое выравнивание и форматирование пользовательских типов.
Расширенные возможности:
- позиционные аргументы:
{0},{1},{2}; - именованные аргументы:
{name},{value}; - выравнивание и заполнение:
{:>10},{:<10},{:^10}; - форматирование чисел:
{:d},{:x},{:f},{:.2f}; - локализованное форматирование:
{:L}; - поддержка даты и времени.
Безопасный вывод и ввод-вывод
Помимо форматирования, fmt предоставляет безопасные и эффективные альтернативы стандартным потокам C++. Эти функции обеспечивают лучшую производительность и безопасность типов.
Функции ввода-вывода:
fmt::print()иfmt::println()— безопасный вывод с поддержкой форматирования;fmt::fprintf()— аналогfprintfс проверкой типов;fmt::ostream— потоковый вывод с поддержкой форматирования;fmt::scan()иfmt::scanf()— безопасный ввод с разбором форматированных строк.
Поддержка пользовательских типов
fmt позволяет легко добавлять поддержку форматирования для пользовательских типов с помощью специализации шаблона formatter. Это обеспечивает единообразный синтаксис форматирования для всех типов.
Способы расширения:
- специализация
fmt::formatter<T>с методамиparseиformat; - использование макроса
FMT_FORMAT_ASдля форматирования через существующий тип; - реализация функции
format_asдля простых случаев; - автоматическое форматирование структур с помощью рефлексии (экспериментально).
Локализация и интернационализация
fmt предоставляет встроенную поддержку локалей для форматирования чисел, дат и других локале-зависимых данных. Это позволяет легко создавать интернационализированные приложения.
Возможности локализации:
- форматирование чисел с разделителями групп:
{:,}; - локализованные представления даты и времени;
- поддержка пользовательских локалей через
std::locale; - интеграция с системами перевода.
Интеграция с системой сборки
fmt легко интегрируется в различные системы сборки и может использоваться как header-only библиотека или как отдельная библиотека времени выполнения.
Варианты интеграции:
- header-only режим (подключение
fmt/core.h); - отдельная библиотека для уменьшения времени компиляции;
- поддержка CMake, Bazel, Conan, vcpkg и других систем сборки;
- совместимость с
std::formatиз C++20.
Инструменты и утилиты
fmt включает вспомогательные инструменты для разработки и отладки форматирования.
Полезные утилиты:
fmt::join()— форматирование диапазонов с разделителем;fmt::to_string()— преобразование значения в строку;fmt::memory_buffer— эффективный буфер для инкрементального форматирования;fmt::arg()— создание именованных аргументов;fmt::styled()— форматирование с применением стилей.