fmt中几个技法

最简状态机实现


struct {state current_state = state::start;FMT_CONSTEXPR void operator()(state s, bool valid = true) {if (current_state >= s || !valid)throw_format_error("invalid format specifier");current_state = s;}
} enter_state;2336:       enter_state(state::align);
2344:       enter_state(state::sign, in(arg_type, sint_set | float_set));
2360:       enter_state(state::hash, is_arithmetic_type(arg_type));
2365:       enter_state(state::zero);
2387:       enter_state(state::width);
2392:       enter_state(state::precision,
2399:       enter_state(state::locale, is_arithmetic_type(arg_type));
2457:       enter_state(state::align, align != align::none);

函数内声明类,并处理业务

  struct writer {FMT_CONSTEXPR void operator()(const Char* from, const Char* to) {if (from == to) return;for (;;) {const Char* p = nullptr;if (!find<IS_CONSTEXPR>(from, to, Char('}'), p))return handler_.on_text(from, to);++p;if (p == to || *p != '}')return handler_.on_error("unmatched '}' in format string");handler_.on_text(from, p);from = p + 1;}}Handler& handler_;} write = {handler};while (begin != end) {// Doing two passes with memchr (one for '{' and another for '}') is up to// 2.5x faster than the naive one-pass implementation on big format strings.const Char* p = begin;if (*begin != '{' && !find<IS_CONSTEXPR>(begin + 1, end, Char('{'), p))return write(begin, end);write(begin, p);begin = parse_replacement_field(p, end, handler);}

搜索字节

std::memchr 是 C++ 标准库中的一个函数,它用于在一段内存中搜索指定的字节值。

函数签名如下:

void* memchr(const void* ptr, int value, std::size_t num);

参数说明:

  • ptr:指向要搜索的内存块的起始地址。
  • value:要搜索的字节值,作为整数表示。
  • num:要搜索的字节数。

函数功能:

  • std::memchr 在给定的 ptr 指向的内存块中搜索 value 所表示的字节值。
  • 它会扫描 num 个字节,直到找到第一个匹配的字节值或扫描完整个内存块。
  • 如果找到匹配的字节值,它将返回指向该字节的指针。
  • 如果没有找到匹配的字节值,它将返回 nullptr

std::memchr 是一个 C 风格的函数,可以用于处理任意类型的内存块,而不仅限于字符数据。它在很多情况下很有用,比如在处理二进制数据、搜索特定字节模式等场景。

需要注意的是,std::memchr 函数返回的指针类型是 void*,这意味着需要将其转换为适当的类型才能访问所找到的字节。在 C++ 中,可以通过使用 reinterpret_cast 或将其转换为其他类型的指针,以便进行进一步的操作。

以下是一个示例,展示了如何使用 std::memchr 函数在内存块中搜索特定的字节值:

#include <iostream>
#include <cstring>int main() {const char* str = "Hello, World!";std::size_t size = std::strlen(str);char target = 'W';void* result = std::memchr(str, target, size);if (result != nullptr) {std::ptrdiff_t position = static_cast<char*>(result) - str;std::cout << "Found at position: " << position << std::endl;} else {std::cout << "Not found!" << std::endl;}return 0;
}

在上述示例中,我们使用 std::memchr 函数在字符串 str 中搜索字节值 'W'。如果找到匹配的字节,我们计算其相对于起始地址 str 的位置,并输出结果。如果没有找到匹配的字节,我们输出 “Not found!”。

模板别名

template <typename T, typename Context>
using has_formatter =
std::is_constructible<typename Context::template formatter_type>;

这段代码使用了模板别名(template alias)和模板元编程中的 std::is_constructible 类型特性来定义了一个模板元函数 has_formatter

has_formatter 是一个模板元函数,它接受两个模板参数 TContext。该模板元函数使用 typename Context::template formatter_type<T> 来访问 Context 类型中的嵌套类型 formatter_type<T>

然后,使用 std::is_constructible 类型特性来判断是否可以通过调用 formatter_type<T> 的构造函数来构造一个对象。std::is_constructible 是一个类型特性,用于检查给定的类型是否可以通过特定的参数列表进行构造。

通过将 has_formatter 定义为一个模板别名(using),可以使用 has_formatter<T, Context>::value 来获取类型特性的值,该值表示是否可以构造 formatter_type<T> 对象。

这种技术通常用于编译时的条件编程,通过在模板实例化期间进行类型检查和分支选择,从而根据类型特性实现不同的行为。

以下是一个使用示例:

#include <iostream>
#include <type_traits>struct Context {template <typename T>struct formatter_type {formatter_type() {std::cout << "Constructing formatter for type T" << std::endl;}};
};// 检查是否具有 formatter_type<T> 类型的构造函数
template <typename T, typename Context>
using has_formatter =std::is_constructible<typename Context::template formatter_type<T>>;int main() {std::cout << std::boolalpha;std::cout << "has_formatter<int, Context>: "<< has_formatter<int, Context>::value << std::endl;std::cout << "has_formatter<double, Context>: "<< has_formatter<double, Context>::value << std::endl;return 0;
}

在上述示例中,Context 类定义了一个嵌套的模板类型 formatter_type。然后,使用 has_formatter 模板别名来检查是否可以构造 formatter_type<T> 对象。根据模板参数 T 的不同,我们可以看到不同的构造函数被调用。

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

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

相关文章

ivrobot乐高EV3 鲸鱼 能力风暴自制遥控手柄库文件和编程样例 使用指南

编程示例&#xff1a; 资源下载链接&#xff1a; https://download.csdn.net/download/abilix_tony/88739582 EV3 mindstorms能用基础版和高阶版&#xff08;条形编程界面&#xff09; EV3 classroom只能用基础版 &#xff08;scratch模块形状编程界面&#xff09; 请根据使…

WEB前端人机交互导论实验-实训2格式化文本、段落与列表

1.项目1 文本与段落标记的应用&#xff1a; A.题目要求: B.思路&#xff1a; &#xff08;1&#xff09;首先&#xff0c;HTML文档的基本结构是通过<html>...</html>标签包围的&#xff0c;包含了头部信息和页面主体内容。 &#xff08;2&#xff09;在头部信息…

【AI的未来 - AI Agent系列】【MetaGPT】2. 实现自己的第一个Agent

在MetaGPT中定义的一个agent运行示例如下&#xff1a; 一个agent在启动后他会观察自己能获取到的信息&#xff0c;加入自己的记忆中下一步进行思考&#xff0c;决定下一步的行动&#xff0c;也就是从Action1&#xff0c;Action2&#xff0c;Action3中选择执行的Action决定行动…

RPC:Remote Procedure Call 远程过程调用

目前&#xff0c;对于一个完整的应用来说&#xff0c;通常包含了若干支持不同功能的服务&#xff0c;亦或者是函数&#xff0c;这些服务之间往往可能需要互相调用&#xff0c;使用已经实现的服务功能&#xff0c;而不是需要在每个服务进程中再去重复实现已经有的功能。 这不仅…

ADSelfService Plus 推出离线多因素身份验证以提升远程工作安全性

采用先进验证方法&#xff0c;确保在任何时间、地点或连接问题下对业务数据的合法访问即使远程用户未连接到身份验证服务器或互联网&#xff0c;也可通过MFA安全认证。 MFA 得克萨斯州德尔瓦雷 — 2023年5月3日 — Zoho Corporation 旗下的企业IT管理部门ManageEngine今日宣布…

CentOS7单机部署Minio

1、下载二进制文件 # minio运行目录 cd /soft/minio # 下载minio二进制文件 wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio # 赋权 chmod x minio # 建立minio操作目录 mkdir /mnt/minio/data 2、建立启动脚本 cd /soft/minio vi start.sh 脚本内容…

抖音小店无货源爆单技巧大公开!教你如何与达人合作!

大家好&#xff0c;我是电商花花。 现在越来越多的人开始关注抖音小店电商&#xff0c;尝试着做抖音小店&#xff0c;我们做抖音小店除了要选品之外&#xff0c;我们还要学会找达人合作&#xff0c;让达人帮我们带货出单。 今天给大家讲一下如何找达人合作带货&#xff0c;如…

【AIGC】AnimateDiff:无需定制化微调的动画化个性化的文生图模型

前言 Animatediff是一个有效的框架将文本到图像模型扩展到动画生成器中&#xff0c;无需针对特定模型进行调整。只要在大型视频数据集中学习到运动先验知识。AnimateDiff就可以插入到个性化的文生图模型中&#xff0c;与Civitai和Huggingface的文生图模型兼容&#xff0c;也可…

6 功能开发

功能开发 6 功能开发1.发布1.1 小程序1.2 API1.3 规则 2.restful api回顾2.1 APIView &#xff08; 可以 &#xff09;2.2 ListAPIView2.2.1 用户传递某些值2.2.2 fields和exclude的区别&#xff1f;2.2.3 read_only2.3.4 复杂需求2.3.5 serializers嵌套 3. 首页展示扩展&#…

把项目转换为md知识库,提供给gpts使用

把项目转换为md知识库&#xff0c;提供给gpts使用 import osimport chardetproject_path # 项目目录路径 project_name # 项目名称# 定义全局字典&#xff0c;映射文件后缀名到Markdown代码块的语言 language_mapping {.java: java,.py: python,.js: javascript,.html: html,…

polar CTF CB链

一、题目 二、解答 1、通过jar包&#xff0c;可以看到/user路由下有反序列化操作 看到存在commons-beanutils依赖且版本为1.9.2&#xff0c;可利用CB链Getshell。 使用ysoserial项目中的CommonsBeanutils1链写一个POC&#xff0c;注意确保ysoserial项目中的pom.xml中的comm…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux网络编程第一天-socket编程(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式培训笔记,嵌入式硬件,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机领域.https://blog.csdn.net/weixin_3980490…

8.1 Centos安装部署Redis

文章目录 前言一、下载Redis二、编译Redis三、配置redis.conf四、启动Redis服务端五、启动Redis客户端测试前言 本文将手把手演示在CentOS7上安装部署Redis。 一、下载Redis 可以使用wget命令进行下载,这里下载到/app目录 wget http://download.redis.io/releases/redis-5.…

Codeforces Round 908 (Div. 2) C. Anonymous Informant (思维题)

题目链接 思路: 考虑到 k 的范围很大, 肯定不能进行模拟。 通过观察以及题目的条件, a[i] i 时是定点, 并循环左移 i 次, 则左移后, 数组的最后一位即为该定点, 且通过这个定点可以知道此定点未左移时, 数组的第一个数是什么, 也就可以知道当时数组的最后一个数是什么, 即又找…

webserver面试

1 难点 1.1 网络框架的选取 常见的有reactor和proactor,在linux中&#xff0c;异步io不完善&#xff0c;所以很多项目都采用reactor模式。我又参考了开源的项目&#xff0c;最终选择使用同步io模拟异步的模式。 1.2 RAII 参考开源项目&#xff0c;资源获取即初始化&#xf…

Centos安装Datax

Centos7安装DataX 一、DataX简介二、DataX的数据源支持三、安装DataX1、下载DataX2、解压3、检验是否安装成功4、使用 四、实践案例1、环境信息2、编写同步的配置文件(user_info.json)3、执行同步4、验证同步结果 一、DataX简介 DataX 是阿里云 DataWorks数据集成 的开源版本&a…

【Unity】空引用处理方法总结

在 Unity 中&#xff0c;空处理&#xff08;Null Handling&#xff09;指的是在处理对象引用时&#xff0c;考虑到可能为空&#xff08;null&#xff09;的情况&#xff0c;并采取适当的措施来避免潜在的错误或异常。下面是一些处理空引用的常见方法&#xff1a; 空引用检查&am…

RocketMQ源码阅读-Message消息存储

RocketMQ源码阅读-Message消息存储 1. CommitLog的作用2. CommitLog 存储消息3. 时序图4. 小结 在Broker消息接收一篇中&#xff0c;分析到Broker接收到消息&#xff0c;最终会调用CommitLong#putMessage方法存储消息。 本篇来分析CommitLong#putMessage存储消息的流程。 1. C…

自编C++题目——战争

预估难度 困难 题目描述 国与国以河为界&#xff0c;有一天他们两国发生了战争&#xff0c;在边疆的战士开始了厮杀。小明是一个参谋&#xff0c;他也知道两国的兵都能打个人&#xff0c;所以他想让你帮忙安排布置兵&#xff0c;以击杀所有国的兵。 打仗规则 只能打在同一…

Java-集合-FAQ-List/Set/Map区别

1 需求 2 接口 3 示例 4 参考资料 JAVA学习-List&#xff0c;Set&#xff0c;Map三者的区别_list<list<integer>>和map区别-CSDN博客 Java集合-HashSet的使用及与LinkedHashSet、TreeSet的对比_linkedhashset和treeset的区别-CSDN博客 java中Map有哪些实现类_ma…