C++20 格式化字符串的实现

 更新时间:2024年10月29日 09:30:04   作者:程序员的园  
本文主要讲述了C++20中新引入的std::format功能,该功能用于格式化字符串,提供了一种简洁、类型安全且灵活的方式来构建格式化字符串,文章从使用场景、格式化规则、自定义类型的格式化等方面进行了详细的介绍,感兴趣的可以了解一下

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

概述

std::format 是 C++20 中引入的一个新功能,用于格式化字符串。它位于 <format> 头文件中,并提供了一种类似于 Python 中 f-string 的语法来构建格式化字符串。

使用场景

字符串格式化

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.如果实际输出时带输出字符串需要被{}包含时如何实现呢。

格式化规则

_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后续称为——“变量”

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

std::string name = "Alice";
int age = 30;
std::string formatted_str = std::format("Name: {}, Age: {}", name, age);
//output:Name: Alice, Age: 30

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

std::string formatted_str = std::format("Name: {}, {},Age: {}", "Alice", 30);//throw error

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

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

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

  std::string ret = std::format("name {}  age {{   {}  }}", "janny", 20);
//output:
//name janny  age {   20  }

自定义类型的格式化

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

#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提供类型安全且灵活的字符串格式化方法,使用时要牢记{}的个数不要大于变量的个数;同时,自定义数据类型需要提供格式化器。

到此这篇关于C++20 格式化字符串的实现的文章就介绍到这了,更多相关C++20 格式化字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C/C++中*和&的用法详解

    C/C++中*和&的用法详解

    在本篇文章中我们给大家总结了C/C++中*和&的用法以及相关的代码分享,有兴趣的朋友赶紧学习下吧。
    2018-03-03
  • C++ 实现读写锁的代码详解

    C++ 实现读写锁的代码详解

    C++读写锁是一种多线程同步机制,它允许多个线程同时读取共享数据,但只允许一个线程写入共享数据,这种锁可以提高程序的并发性和性能,本文给大家介绍了C++ 实现读写锁的代码,需要的朋友可以参考下
    2023-10-10
  • 利用Matlab绘制好看的弦图

    利用Matlab绘制好看的弦图

    弦图在python中以及R中非常常见,但是MATLAB中却始终没有相关函数。本文就来用Matlab绘制一些好看的弦图,感兴趣的小伙伴可以了解一下
    2022-08-08
  • 深入分析C++派生类中的保护成员继承

    深入分析C++派生类中的保护成员继承

    这篇文章主要介绍了C++派生类中的保护成员继承,深入对C++面向对象编程的继承机制进行了解析,需要的朋友可以参考下
    2015-09-09
  • Matlab利用prim算法实现迷宫的生成

    Matlab利用prim算法实现迷宫的生成

    普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。本文将利用prim算法迷宫生成及其艺术渲染,感兴趣的可以了解一下
    2022-10-10
  • C语言 全局变量和局部变量详解及实例

    C语言 全局变量和局部变量详解及实例

    这篇文章主要介绍了C语言 全局变量和局部变量详解及实例的相关资料,需要的朋友可以参考下
    2017-01-01
  • 一起来了解一下C++的结构体 struct

    一起来了解一下C++的结构体 struct

    这篇文章主要为大家详细介绍了C++的结构体struct,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • QT的几种QMap插入顺序说明

    QT的几种QMap插入顺序说明

    本文主要介绍了QT的几种QMap插入顺序说明,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • C++ Boost PropertyTree示例超详细讲解

    C++ Boost PropertyTree示例超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • 详解Dev C++使用教程(使用Dev C++编写C语言程序)

    详解Dev C++使用教程(使用Dev C++编写C语言程序)

    这篇文章主要介绍了详解Dev C++使用教程(使用Dev C++编写C语言程序),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论