我如何使用 C++20 std::format?

How can I use C++20 std::format?

C++20 引入了std::format。与 printfstd::cout 相比有哪些优势? 我该如何使用它,有人举了个例子吗?

C++20 的 std::format 主要只是包含许多人已经在使用的 fmt 库(我们将其用作 spdlog 日志框架的一部分)。

所以,如果你想使用它,你可以下载fmt

至于优点,它具有流的类型安全性,但没有冗长(legacy-C printf 简洁但既不是类型安全的也不是可扩展的) .这是我们自己的代码库中的示例(稍作修改):

std::string idStr = fmt::format("prefix.{:05d}.suffix", id);

否则需要 less 而不是简洁的标准 C++:

std::string idStr;
{
    std::stringstream ss;
    ss << "prefix." << std::setfill('0') << std::setw(5) << id << ".suffix";
    idStr = ss.str();
}

What are the advantages over printf

类型安全。对于 printf,程序员必须小心地将格式说明符与参数类型相匹配。如果他们犯了错误,程序的行为是不确定的。这是一个非常常见的错误来源,尤其是对于初学者。

公平地说,只要使用常量格式字符串,只要程序员记住/知道如何启用警告,体面的编译器就会诊断出这些错误。无论如何,使用模板参数推导自动选择格式化类型更方便,更安全。

此外,无法扩展 printf 以支持打印 class 类型。

or std::cout

流操纵器非常麻烦和冗长,并且行为不一致。一些操纵器是 "sticky",影响所有后续插入,而其他操纵器只影响单个插入。

在 iostream API 中格式和参数之间缺乏分离可以说使得更难理解(预期的)结果。

How can I use it

要么等待你的编译器/标准库实现支持它。 或者,如果不想等待,请改用 original non-standard version。然后按照文档。

规范规范为C++ standard. There are also websites that present the standard, including this library in a more convenient format. Another good source of information is the standard proposal。非标准版本的回购协议(在上一段中链接)也有大量文档,尽管与标准版本有所不同。

and someone give an example of it?

给你(改编自 libfmt 的文档):

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