fmt:C++ 格式化库

news2024/12/22 19:10:17

在这里插入图片描述

fmt 是一个现代化、快速且安全的 C++ 格式化库,专注于高效地格式化文本。它提供了类似 Python 的 format 功能,但具有更高的性能和类型安全特性。fmt 库在处理字符串格式化、日志输出以及构建用户友好的输出时尤为强大。自从 C++20 标准引入 std::format 后,fmt 作为其原型库已经广泛应用于各种 C++ 项目中。

在这里插入图片描述

华丽的分割线

⭕️宇宙起点

    • 💯 主要特点
    • 💯 安装和集成
      • 使用 vcpkg 安装
      • 使用 CMake 直接集成
      • 使用 Conan 安装
    • 💯 fmt 库的基本用法
      • 基本格式化
      • 带格式的输出
      • 日志格式化
    • 💯 高级功能
      • 动态格式化
      • 自定义类型格式化
    • 💯 性能优势
    • 💯 与 `std::format` 的关系
    • 📥 下载地址
    • 💬 结语
    • 📒 参考文献


标题1

💯 主要特点

  • 类型安全:fmt 使用 C++ 的模板机制,确保在编译时进行类型检查,防止格式错误。
  • 高性能:fmt 经过精心优化,能够比传统的 sprintf 函数更高效地进行字符串格式化操作。
  • 简洁的 API:fmt 提供了简单且直观的 API,降低了格式化操作的复杂度。
  • 丰富的格式支持:支持各种数据类型和自定义格式化功能,满足复杂的格式化需求。
  • 与 C++ 标准兼容:fmt 库作为 C++20 std::format 的基础,与现代 C++ 完美结合。

标题2

💯 安装和集成

fmt 可以通过多种方式安装,并轻松集成到您的项目中。

使用 vcpkg 安装

vcpkg 是一种流行的包管理工具,可以轻松安装 fmt:

vcpkg install fmt

然后在 CMake 中使用:

find_package(fmt REQUIRED)
target_link_libraries(your_project_name PRIVATE fmt::fmt)

使用 CMake 直接集成

如果您不使用包管理工具,也可以通过将 fmt 源码直接集成到项目中:

  1. 下载 fmt 源码。
  2. 在 CMake 文件中包含 fmt:
add_subdirectory(fmt)
target_link_libraries(your_project_name PRIVATE fmt::fmt)

使用 Conan 安装

Conan 是另一个流行的 C++ 包管理工具:

conan install fmt/11.0.0@

这可以自动下载并配置 fmt 以供项目使用。


标题3

💯 fmt 库的基本用法

fmt 的核心功能是格式化字符串。与传统的 printf 不同,它更具可读性并支持现代 C++ 的类型安全机制。以下是 fmt 库的一些常见用法。

基本格式化

printf 类似,fmt 提供了格式化功能,但语法更加简洁:

#include <fmt/core.h>
#include <iostream>

int main() {
    std::string name = "John";
    int age = 25;
    
    std::string result = fmt::format("姓名: {}, 年龄: {}", name, age);
    std::cout << result << std::endl;
    return 0;
}

在上述代码中,fmt::format 使用 {} 作为占位符,与 Python 的 str.format 类似,并且能够自动推断数据类型。

带格式的输出

fmt 允许为每个占位符指定格式选项,以下是格式化数字的示例:

#include <fmt/core.h>
#include <iostream>

int main() {
    double pi = 3.14159;
    
    std::string result = fmt::format("圆周率: {:.2f}", pi);  // 保留两位小数
    std::cout << result << std::endl;
    return 0;
}

{:.2f} 的含义是将浮点数格式化为两位小数,类似于 printf 中的 %.2f

日志格式化

fmt 也可以用来构建高效的日志系统。相比于传统的日志库,fmt 具有更好的性能表现:

#include <fmt/core.h>
#include <iostream>

void log_info(const std::string &message) {
    std::cout << fmt::format("[INFO]: {}", message) << std::endl;
}

int main() {
    log_info("应用程序启动成功");
    return 0;
}

这种日志输出方式不仅直观,还可以通过 fmt::format 的丰富功能实现复杂的日志格式。


标题4

💯 高级功能

除了基础的字符串格式化,fmt 还提供了许多高级功能,适合更加复杂的应用场景。

动态格式化

fmt 支持根据运行时条件动态构建格式字符串,这使得它在处理不确定格式时非常灵活:

#include <fmt/core.h>
#include <iostream>

int main() {
    std::string fmt_str = "{} is {}";
    std::cout << fmt::format(fmt_str, "The answer", 42) << std::endl;
    return 0;
}

动态格式字符串可以根据输入的不同情况动态改变,灵活性非常高。

自定义类型格式化

fmt 允许用户为自定义类型定义格式化规则,以下是一个为 Point 类型自定义格式化输出的示例:

#include <fmt/core.h>
#include <iostream>

struct Point {
    int x, y;
};

// 定义 Point 类型的格式化规则
template <>
struct fmt::formatter<Point> {
    constexpr auto parse(fmt::format_parse_context& ctx) {
        return ctx.begin();
    }

    template <typename FormatContext>
    auto format(const Point& p, FormatContext& ctx) {
        return fmt::format_to(ctx.out(), "({}, {})", p.x, p.y);
    }
};

int main() {
    Point p = {10, 20};
    std::cout << fmt::format("Point: {}", p) << std::endl;
    return 0;
}

通过自定义格式化器,fmt 可以灵活处理几乎任何类型的数据,并根据需求输出不同格式。


标题5

💯 性能优势

与传统的 printfsprintf 相比,fmt 的性能大幅提升,特别是在处理大量格式化操作时。它通过优化内部内存管理和避免不必要的类型转换,减少了运行时的性能损耗。

根据官方基准测试,fmt 在多数情况下都比标准的 C++ iostream 和 C 风格的 sprintf 更快。以下是官方提供的一些基准数据:

操作类型fmt 性能提升传统方法
字符串格式化2 倍sprintf
自定义类型格式化3 倍手动实现
日志输出约 30% 提升iostream

通过使用 fmt,开发者不仅能够编写更加清晰、可读的代码,同时还能够在高性能应用中减少性能瓶颈。


标题6

💯 与 std::format 的关系

fmt 库的 API 与 C++20 引入的 std::format 非常相似,事实上,std::format 是基于 fmt 库的实现原型。随着 C++20 的普及,std::format 也将成为标准库的一部分。但是,fmt 提供了比 std::format 更多的扩展功能,如日志功能、动态格式化等,因此即便在 C++20 项目中,fmt 依然是一个非常实用的选择。


标题7

📥 下载地址


fmt 最新版 下载地址


标题8

💬 结语

fmt 是一个功能强大且灵活的 C++ 字符串格式化库,适用于各种需要格式化文本的场景。无论是在简单的字符串拼接、复杂的数据输出,还是自定义类型的格式化方面,fmt 都表现出色。其简洁的 API 和高性能特性,使得 fmt 在现代 C++ 开发中占据了重要位置。

如果你正在寻找一个比 printf 更高效、安全,且更易于使用的 C++ 格式化工具,fmt 将是一个理想的选择。通过其丰富的功能和广泛的应用场景,fmt 能够大幅提升代码的可维护性和运行效率。

📒 参考文献

  • fmt 官网
  • fmt GitHub仓库

TheEnd


在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2182272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《故障扰动下的风火储送端系统频率动态特性与储能容量优化配置》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

婚前协议模版(琴生生物机械科技工业研究所)

婚前协议示例 本协议由甲方&#xff08;全名&#xff09;&#xff0c;身份证号码&#xff08; _________ &#xff09;&#xff0c;与乙方&#xff08;全名&#xff09;&#xff0c;身份证号码&#xff08; _________ &#xff09;&#xff0c;在平等、自愿、相互尊重及充分沟…

DataEase v2 开源代码 Windows 从0到1环境搭建

一、环境准备 功能名称 描述 其它 操作系统 Windows 数据库 Mysql8.0 开发环境 JDK17以上 本项基于的21版本开发 Maven 3.9版本 开发工具 idea2024.2版本 前端 VSCode TIPS&#xff1a;如果你本地有jdk8版本&#xff0c;需要切换21版本&#xff0c;请看…

[python] 基于PyOD库实现数据异常检测

PyOD是一个全面且易于使用的Python库&#xff0c;专门用于检测多变量数据中的异常点或离群点。异常点是指那些与大多数数据点显著不同的数据&#xff0c;它们可能表示错误、噪声或潜在的有趣现象。无论是处理小规模项目还是大型数据集&#xff0c;PyOD提供了50多种算法以满足用…

解决银河麒麟fcitx进程资源占用高的问题

解决银河麒麟fcitx进程资源占用高的问题 1、问题描述2、解决方法 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 1、问题描述 银河麒麟桌面系统中&#xff0c;fcitx进程占用CPU和内存过高&#xff0c;导致系统卡顿。 2、解决方法 卸载并清…

OPENCV判断图像中目标物位置及多目标物聚类

文章目录 在最近的项目中&#xff0c;又碰到一个有意思的问题需要通过图像算法来解决。就是显微拍摄的到的医疗图像中&#xff0c;有时候目标物比较偏&#xff0c;也就是在图像的比较偏的位置&#xff0c;需要通过移动样本&#xff0c;将目标物置于视野正中央&#xff0c;然后再…

IP协议讲解

IP协议 IP协议的本质&#xff1a;提供一种能力&#xff0c;将数据跨网络从A主机传输到B主机 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4. 4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大 的数字是15, 因…

Linux(三)文件管理、复杂操作与实用工具详解

Linux学习笔记&#xff08;三&#xff09;文件管理、复杂操作与实用工具详解 Linux 学习笔记&#xff08;二&#xff09;&#xff1a;深入理解用户管理、运行级别与命令行操作 1.文件操作的基本操作 1.1 创建 创建目录 mkdir&#xff1a;创建目录 mkdir /home/dog # 创建单级…

【顺序表使用练习】发牌游戏

【顺序表使用练习】发牌游戏 1. 介绍游戏2. 实现52张牌3. 实现洗牌4. 实现发牌5. 效果展示 1. 介绍游戏 首先先为大家介绍一下设计要求 实现52张牌&#xff08;这里排除大小王&#xff09;洗牌——打乱牌的顺序发牌——3个人&#xff0c;1人5张牌 2. 实现52张牌 创建Code对象创…

NVIDIA G-Assist 项目:您的游戏和应用程序AI助手

NVIDIA G-Assist 是一个革命性的人工智能助手项目&#xff0c;旨在通过先进的AI技术提升玩家的游戏体验和系统性能。这个项目在2024年Computex上首次亮相&#xff0c;展示了其在游戏和应用程序中的潜在应用。 喜好儿网 G-Assist 的核心功能是提供上下文感知的帮助。它能够接收…

OLED移植

一、在D盘中找到OLED文件包 二、新建一个HAL库工程 只需要配好RCC和SYS以及时钟树就可以&#xff0c;不开启任何引脚 三、移植文件 把文件放在Core->Src里面 四、在Kile5中添加文件 五、注意 &#xff08;1&#xff09;下载的时候要开启Rsset and Run 不然下载不进程序 &a…

关于malloc,calloc,realloc

1.引用的头文件介绍&#xff1a; 这三个函数需要调用<stdlib.h>这个头文件 2.malloc 2.1 函数简单介绍&#xff1a; 首先这个函数是用于动态开辟一个空间&#xff0c;例如数组在c99标准之前是无法arr[N]的&#xff0c;这个时候就需要使用malloc去进行处理&#xff0c…

kettle从入门到精通 第八十八课 ETL之kettle kettle连接sqlserver彻底搞明白

场景&#xff1a;时不时群里面会有小伙伴咨询使用kettle连接ms sqlserver 数据库&#xff0c;折腾很久浪费时间&#xff0c;今天刚好有时间把这一块梳理下&#xff0c;希望能让大家节省时间提高效率。 1、首先要知道连接sqlserver 有两种方式&#xff0c;JTDS jdbc驱动和微软的…

Web安全 - 重放攻击(Replay Attack)

文章目录 OWASP 2023 TOP 10导图1. 概述2. 重放攻击的原理攻击步骤 3. 常见的重放攻击场景4. 防御重放攻击的技术措施4.1 使用时效性验证&#xff08;Time-Based Tokens&#xff09;4.2 单次令牌机制&#xff08;Nonce&#xff09;4.3 TLS/SSL 协议4.4 HMAC&#xff08;哈希消息…

4.1、FineReport单元格扩展和父子格

单元格扩展 1、配置数据集 2、纵向扩展 方法一&#xff1a; 方法二&#xff1a; 结果 多个字段纵向 2、横向扩展 方法一&#xff1a; 方法二&#xff1a; 结果 父子格 没什么特殊要求&#xff0c;就保持默认 1、右边的值默认以左边为左父格 2、下边的值默认以上边…

Node.JS 版本管理工具 Fnm 安装及配置(Windows)

Fnm 安装及配置&#xff08;Windows&#xff09; Fnm&#xff08;Fast Node Manager&#xff09;&#x1f680; 一个快速而简单的 Node.js 版本管理工具&#xff0c;使用 Rust 编写。 1 安装 官网&#xff1a;Fnm&#xff08;镜像网站 &#xff09;。下载&#xff1a;Fnm&a…

高德POI数据下载详细说明

本文详细总结了如何利用地图资源下载工具&#xff08;geodatatool&#xff09;下载高德POI数据。下载POI数据相对比较复杂。加上地图资源下载工具&#xff08;geodatatool&#xff09;下载功能越来越多、越复杂&#xff01;很多时候我给网友介绍的时候也会出现纰漏&#xff01;…

第4篇:如何在百万行代码里发现隐藏的后门----应急响应篇

试想一下&#xff0c;如果你的网站被入侵&#xff0c;攻击者留下隐藏的后门&#xff0c;你真的都可以找出来嘛&#xff1f;面对一个大中型的应用系统&#xff0c;数以百万级的代码行&#xff0c;是不可能做到每个文件每段代码进行手工检查的。 即使是一款拥有99.9%的Webshell检…

鸿蒙NEXT开发-组件事件监听和状态管理(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

SpringBoot + ITextPdf:高效生成 PDF 预览文件

问过神奇的chatgpt后&#xff0c;了解到iTextPdf这个库&#xff0c;应该是比较好的选择。 解决方案 我们先观察下真实的开票预览的模板。 发票信息由两部分组成&#xff1a; 固定信息&#xff0c;例如购买方信息、销售方信息。 商品信息&#xff0c;可能有多行&#xff0c;需…