c++ fmtlib怎么用 c++高性能格式化库【教程】

20次阅读

fmt(原fmtlib)是c++中高性能、类型安全、易用的格式化库,比printf和std::oStringstream更快更简洁,C++20 std::format基于它设计,支持编译期检查、自定义类型格式化、跨平台及轻量单头使用。

c++ fmtlib怎么用 c++高性能格式化库【教程】

fmtlib(现在叫 fmt)是 C++ 中性能极佳、类型安全、易用的格式化库,比 printfstd::ostringstream 更快更简洁,C++20 的 std::format 就是基于它设计的。它支持编译期检查、自定义类型格式化、跨平台,且头文件轻量(也可静态链接)。

快速上手:安装与基础用法

推荐使用 vcpkg 或 Conan 管理依赖,或直接下载单头版(fmt/format.h):

#include  #include   int main() {     std::string s = fmt::format("Hello, {}! You have {} messages.", "Alice", 42);     std::cout << s << "n"; // 输出:Hello, Alice! You have 42 messages. }

进阶技巧:格式说明符与类型支持

fmt 支持丰富的格式说明符,语法统一、直观,且自动推导类型:

  • {}:自动类型推导(支持 int、double、string、vector 等内置/STL 类型)
  • {:d} 十进制,{:x} 十六进制,{:.2f} 保留两位小数
  • {:>10} 右对齐占宽 10,{:^8} 居中,{: 左对齐
  • {:+d} 强制显示符号,{:08x} 补零八位十六进制

fmt::print("pi ≈ {:.6f}, hex={:08x}, flag={:+d}n", 3.1415926, 255, -7); // 输出:pi ≈ 3.141593, hex=000000ff, flag=-7

自定义类型格式化(关键能力)

让自己的结构体或类支持 fmt 格式化,只需特化 fmt::formatter 模板:

立即学习C++免费学习笔记(深入)”;

  • 定义 parse() 解析格式说明符(如 {:s}
  • 实现 format() 返回格式化后的字符串视图
  • 推荐用 FMT_STRING 宏启用编译期检查(可选但强烈建议)

#include   struct Point { int x, y; };  template <> struct fmt::formatter {     constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }     template      auto format(const Point& p, FormatContext& ctx) {         return fmt::format_to(ctx.out(), "({},{})", p.x, p.y);     } };  // 使用 fmt::print("Origin: {}n", Point{0, 0}); // 输出:Origin: (0,0)

高性能提示:避免运行时解析、用 print 替代 string 构造

fmt 的高性能核心在于:格式字符串在编译期解析(配合 FMT_STRING),且 fmt::print 直接输出到 stdout / file,不构造中间 string:

  • fmt::print("msg: {}n", x) 替代 std::cout (更安全、更快)
  • 日志场景优先用 fmt::printlnfmt::print(stderr, ...)
  • C++20 起可直接用 std::format(行为与 fmt 兼容,但部分高级特性需 fmt)

text=ZqhQzanResources