libfmt和std::format有什么区别?

16

我知道c++20格式化提案是libfmt的一部分的正式化,而libfmt是其规范实现。但据我了解,libfmt提供了超出c++20标准规定的其他功能。这些额外的功能是什么?

另外,主要的编译器厂商是只包含libfmt的一个子集还是重新实现它?

1个回答

27

在libfmt中有许多东西不在C++20格式中:

  • fmt::print() 可以直接将输出打印到stdout。
  • fmt::memory_buffer 是一种动态大小的容器,可以通过 fmt::format_to(buf, ...) 进行格式化操作。
  • 支持格式化 ranges 和 tuples,包括 fmt::join()
  • 支持 named arguments,例如 fmt::print("Elapsed time: {s:.2f} seconds", "s"_a=1.23);
  • 可以使用 FMT_COMPILE 进行编译时格式字符串处理,不过 fmt::format 和 C++20 的 std::format 都默认支持编译时格式字符串处理。同时,fmt::format 有一个名为 fmt::runtime 的转义钩子,而 std::format 则没有这个功能。

C++23 更新:C++23 中包含了 std::print (P2093) 和格式化范围和元组 (P2286)。

5
我不认为在C++20中有fmt::colorfmt::emphasis,但我很希望我是错的。 :-) - Ted Lyngmo
C++20允许在编译时使用 string_view 字面量作为 FMT_COMPILE 的替代吗? - Emile Cormier
换句话说,当将string_view字面量作为格式字符串传递时,C++20实现是否能执行与FMT_COMPILE相同类型的优化? - Emile Cormier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接