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 
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++20引入了一个新的标准库组件,即std::formatter。它是用于格式化输出的模板函数,可以用于自定义类型格式化输出。使用std::formatter,你可以定义自己的格式化规则,并且可以在标准库提供的格式化函数中使用它。 std::formatter是一个模板类,它有两个模板参数:一个是要格式化类型,另一个是用于格式化的字符类型。你需要提供一个特化的std::formatter模板类来定义你的自定义类型格式化规则。 在特化的std::formatter类中,你需要定义format函数。这个函数接受两个参数:要格式化的值和一个std::format_context对象。你可以使用std::format_context来获取格式化选项,并使用std::format_arg来获取参数列表。 下面是一个简单的示例,展示了如何使用std::formatter格式化自定义类型: ```cpp #include <format> struct MyType { int value; }; template <> struct std::formatter<MyType> { constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); } template <typename FormatContext> auto format(const MyType& value, FormatContext& ctx) { return std::format_to(ctx.out(), "MyType(value={})", value.value); } }; int main() { MyType myValue{42}; std::string formatted = std::format("My value: {}", myValue); std::cout << formatted << std::endl; // 输出:My value: MyType(value=42) return 0; } ``` 在这个例子中,我们定义了一个名为MyType的结构体,并为它特化了std::formatter模板类。在format函数中,我们使用std::format_to来将格式化的结果输出到格式上下文的输出迭代器中。 这只是一个简单的示例,你可以根据自己的需求定义更复杂的格式化规则。通过使用std::formatter,你可以轻松地将自定义类型集成到C++格式化输出机制中。希望这可以帮助到你!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值