# fmt

Современная библиотека форматирования строк для C++, предоставляющая безопасную, расширяемую и высокопроизводительную альтернативу функциям стандартной библиотеки вроде `printf` и `iostreams`. Библиотека реализует предложение C++20 `std::format` и обеспечивает обратную совместимость с более старыми стандартами C++.

## Особенности

- безопасность типов — ошибки форматирования обнаруживаются во время компиляции;
- высокая производительность — быстрее `printf` и потоков C++ в большинстве сценариев;
- поддержка C++11 и выше, включая полную реализацию C++20 `std::format`;
- расширяемость для пользовательских типов;
- поддержка локалей и интернационализации;
- чистый и интуитивно понятный синтаксис.

## Основные компоненты

fmt предоставляет богатый набор функций для форматирования строк, вывода и парсинга (подробнее с документацией можно ознакомиться [здесь](https://fmt.dev/latest/index.html)).

### Базовое форматирование строк

Библиотека предоставляет безопасную и эффективную систему форматирования с использованием синтаксиса, похожего на 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()` — форматирование с применением стилей.
