После восьми месяцев разработки состоялся выпуск 10.0.0 библиотеки форматирования данных fmt — быстрой и безопасной альтернативы stdio
и iostreams
для C++.
#include <fmt/color.h>
int main() {
fmt::print(fmt::emphasis::bold | fg(fmt::color::red),
"Elapsed time: {0:.2f} seconds", 1.23);
}
Список изменений:
- для форматирования чисел с плавающей точкой с заданной точностью взамен алгоритма Grisu используется алгоритм Dragonbox, что дало существенное улучшение производительности;
- для форматирования чисел с плавающей точкой в шестнадцатеричном представлении вместо ранее использованного snprintf применяется собственная реализация;
- улучшена поддержка модулей C++20;
format_as
теперь поддерживает любой пользовательский тип, а не только перечисления:
#include <fmt/format.h>
struct floaty_mc_floatface {
double value;
};
auto format_as(floaty_mc_floatface f) { return f.value; }
int main() {
fmt::print("{:8}\n", floaty_mc_floatface{0.42}); // prints " 0.42"
}
- для совместимости с
std::format
удалены устаревшие неявные преобразования для перечислений и преобразования к примитивным типам; - улучшена поддержка
std::chrono
:
#include <fmt/chrono.h>
int main() {
// prints " 2023"
fmt::print("{:>8%Y}\n", std::chrono::system_clock::now());
}
#include <fmt/chrono.h>
int main() {
// prints 01.234567
fmt::print("{:%S}\n", std::chrono::microseconds(1234567));
}
- добавлена поддержка
std::utc_time
; - добавлена поддержка
std::exception
:
#include <fmt/std.h>
#include <vector>
int main() {
// prints: "vector<bool>::_M_range_check: __n (which is 0) >= this->size() (which is 0)"
try {
std::vector<bool>().at(0);
} catch(const std::exception& e) {
fmt::print("{}", e);
}
}
- улучшена поддержка стандартных контейнеров:
#include <fmt/ranges.h>
#include <stack>
#include <vector>
int main() {
auto s = std::stack<bool, std::vector<bool>>();
for (auto b: {true, false, true}) s.push(b);
fmt::print("{}\n", s); // prints [true, false, true]
}
- добавлена поддержка
std::optional
; - в
fmt::ptr
добавлена поддержкаunique_ptr
с пользовательским деструктором; - улучшена обработка некорректного Юникода в путях файлов;
- добавлена экспериментальная поддержка Юникодных разделителей цифр :
c++
auto loc = std::locale(
std::locale(), new fmt::format_facet<std::locale>("’"));
auto s = fmt::format(loc, "{:L}", 1000);
- для совместимости с
basic_format_string
добавленаfmt::basic_format_string::get()
; - для совместимости с C++23 добавлена функция
println
; - улучшения документации и тестов.
Множество других исправлений и улучшений.
>>> Подробности