{fmt}

{fmt}是一个开源的格式化库,用于替代C的stdio和C++的iostream。

特色:

  • 简便的格式化API,提供本地化用的位置参数。
  • 实现C++ 20 std::format
  • 和python的format类似的格式化字符串语法
  • 使用Dragonbox算法提供快速IEEE 754浮点数格式化和舍入,
  • 可移植的Unicode支持
  • 安全的printf实现,包括POSIX位置参数扩展。
  • 可扩展:支持用户自定义类型
  • 高效:比默认的标准库实现中的(s)printf、iostream、to_string和to_chars更快
  • 源代码和编译后代码尺寸小
  • 可靠:拥有广泛的测试并持续改进
  • 容易使用:无外部依赖,MIT许可
  • 可移植性:在不同平台上提供一致的输出结果,支持旧编译器
  • 代码整洁,不会产生编译警告
  • 默认与本地化环境(Locale)无关
  • 通过FMT_HEADR_ONLY宏,可以作为header-only库使用

代码示例

打印到标准输出

#include <fmt/core.h>

int main() {
  fmt::print("Hello, world!\n");
}

格式化字符串

std::string s = fmt::format("The answer is {}.", 42);
// s == "The answer is 42."
Format a string using positional arguments (run)

std::string s = fmt::format("I'd rather be {1} than {0}.", "right", "happy");
// s == "I'd rather be happy than right."

打印chrono时长

#include <fmt/chrono.h>

int main() {
  using namespace std::literals::chrono_literals;
  fmt::print("Default format: {} {}\n", 42s, 100ms);
  fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s);
}

输出:

Default format: 42s 100ms
strftime-like format: 03:15:30

打印容器

#include <vector>
#include <fmt/ranges.h>

int main() {
  std::vector<int> v = {1, 2, 3};
  fmt::print("{}\n", v);
}

输出:

[1, 2, 3]

在编译期检查格式化字符串

下面的代码在C++20中产生编译器错误,因为对字符串参数来说d是非法的格式符

std::string s = fmt::format("{:d}", "I am not a number");

输出到文件

#include <fmt/os.h>

int main() {
  auto out = fmt::output_file("guide.txt");
  out.print("Don't {}", "Panic");
}

运行速度是fprintf的5到9倍。

最后修改 July 6, 2023: update (eaffefbf)