开发者

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

开发者 https://www.devze.com 2024-10-29 10:47 出处:网络 作者: 程序员的园
目录概述使用场景字符串格式化格式化规则自定义类型的格式化总结在 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::strphping formatted_str = std::format("Name: {},Age: {}", "Alice", 30);
    std::string formhttp://www.devze.comatted_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(); }
        temwww.devze.complate <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 格式化字符串内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相php关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号