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

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

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

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

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

  • GitHub 地址:https://www./link/02251d47085ed33996c248c852dd3fa3
  • 单头版:下载 fmt/format.h 放入项目即可(无需编译)
  • 基础格式化写法类似 Python 的 f-string:
#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)