前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++20 格式化字符串

C++20 格式化字符串

作者头像
程序员的园
发布2024-07-18 13:19:03
780
发布2024-07-18 13:19:03
举报
文章被收录于专栏:程序员的园——原创文章

在 C++20 中引入的 std::format 是一个强大的工具,用于格式化字符串。它提供了一种简洁、类型安全且灵活的方式来构建格式化字符串,同时避免了传统的格式化函数带来的许多问题。

它位于头文件<format>中,使用示例如下:

代码语言:javascript
复制
std::string name = "Alice";
int age = 30;
std::string formatted_str = std::format("Name: {}, Age: {}", name, age);

//output:
//Name: Alice, Age: 30

文中使用{}作为占位符来进行文字替换,会产生如下三个疑问:

1.替换规则是什么?

2.如果占位符多/或少会出现什么问题呢?

3.如果输出字符串需要被{}包含时如何实现呢?

疑惑讲解

如下为std::format的构造函数之一,

代码语言:javascript
复制
_EXPORT_STD template <class... _Types>
_NODISCARD string format(const format_string<_Types...> _Fmt, _Types&&... _Args) {
    return _STD vformat(_Fmt.get(), _STD make_format_args(_Args...));
}

为便于描述,_Fmt后续称为——“格式字符串”,_Args后续称为——“变量”

1. 变量依次替换“格式字符串”中的{};如

代码语言:javascript
复制
std::string name = "Alice";
int age = 30;
std::string formatted_str = std::format("Name: {}, Age: {}", name, age);
//output:Name: Alice, Age: 30

2.如果“格式字符串”中的{}数量大于变量的个数,如下例代码,编译成功,但是运行抛出“std::format_error"异常。

代码语言:javascript
复制
std::string formatted_str = std::format("Name: {}, {},Age: {}", "Alice", 30);//throw error

3. 如果“格式字符串”中的{}数量小于等于变量的个数,假设变量个数为n,则n个变量会替换前n个{}。

代码语言:javascript
复制
std::string formatted_str = std::format("Name: {},Age: {}", "Alice", 30);
std::string formatted_str = std::format("Name: {}, Age: {}", "Alice", 30,"hello");
//output:
//Name: Alice,Age: 30
//Name: Alice, Age: 30

4. 如果带输出的变量需要被{}包含,需要使用{{}}包含{}进而对{}转义,形如{{{}}},最内测的{}为占位符,而外侧的{{}}是{}的占位符

代码语言:javascript
复制
  std::string ret = std::format("name {}  age {{   {}  }}", "janny", 20);
//output:
//name janny  age {   20  }

自定义数据类型的格式化

为实现自定义数据类型的格式化,需要为其提供格式化器,格式化器是标准的,可以参考如下进行修改即可。

代码语言:javascript
复制
#include <format>  
#include <iostream>  

struct vector3 {
    int x, y,z;
};

// 定义一个格式化处理程序  
template <>
struct std::formatter<vector3> {
     auto parse(format_parse_context& ctx) { return ctx.end(); }
    template <typename FormatContext>
    auto format(const vector3 & p, FormatContext& ctx) const {
        return std::format_to(ctx.out(), "({}, {}, {})", p.x, p.y,p.z);
    }
};

void using_format()
{
    vector3 p{ 10, 20,30 };
    std::cout << std::format("The point is: {}\n", p) << std::endl;
}

//output
//The point is: (10, 20, 30)

总结

std::format提供类型安全且灵活的字符串格式化方法,使用时要牢记{}的个数不要大于变量的个数;同时,自定义数据类型需要提供格式化器。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员的园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档