C++20 std::formatter的使用--格式化自定义类型
说明
C++在20标准中正式引入格式化库format,其来自第三方库fmt::format。
头文件
#include <format>
一个简单的format例子
#include <format>
int main()
{
std::cout << std::format("this {} a {} example\n", "is", "simple");
std::cout << std::format("this {0} a {1} example\n", "is", "simple");
std::cout << std::format("this {1} a {0} example\n", "simple", "is");
}
使用方法和python的format是一样的,有关标准格式的说明可以查看std::formatter-cppreference。
做此文主要就是国内互联网上对于formatter的特化讲解少之又少,反正我是找不到,
而cppreference中又只有一个很简单的特化一个泛型类的例子,所以发布此文章一起学习交流。
下面我们进入本文主题——特化格式化器formatter,输出自定义类型变量
格式化自定义类型(class,struct)
在引入format之前,我们输出一个自定义类型都是通过重载std::ostream& operator<<(std::ostream&, const custom_type&)
来输出自己的类
在引入了format之后,那我们就有时候会需要这样输出我们的类
struct Box {
int int_value;
const char* str;
}
int main()
{
Box a {
.int_value = 1;
.str = "Box"
};
std::cout << std::format("a = {}", a);
}
在format里,已经提供了语言内置类型的formatter特化,所以我们可以直接std::cout << std:format("{}", 1)
这样使用,但对于上述的Box类,则需要自己提供formatter的特化来格式化Box。直接看代码
#include <format>
// 非模板类
struct