当前位置: 首页 > news >正文

C++ 折叠表达式

C++ 折叠表达式(Fold Expression)是在 C++17 引入的一种语法,用于简化与可变参数模板的操作。折叠表达式的作用是对参数包(parameter pack)进行递归处理。

折叠表达式有四种类型:

  • 一元左折叠 (Unary Left Fold):
(... op pack)

这会从左向右地将操作符 op 应用于参数包中的元素。

例子:

template<typename... Args>
auto sum(Args... args) {return (... + args);  // 左折叠:((arg1 + arg2) + arg3) + ...
}
  • 一元右折叠 (Unary Right Fold):
(pack op ...)

这会从右向左地将操作符 op 应用于参数包中的元素。

例子:

template<typename... Args>
auto sum(Args... args) {return (args + ...);  // 右折叠:arg1 + (arg2 + (arg3 + ...))
}
  • 二元左折叠 (Binary Left Fold):
(init op ... op pack)

在左折叠的基础上增加一个初始值 init。折叠从左至右,并将 init 作为第一个操作数。

例子:

template<typename... Args>
auto sum(Args... args) {return (0 + ... + args);  // 左折叠,初始值为 0
}
  • 二元右折叠 (Binary Right Fold):

这与二元右折叠类似,只不过 init 是最后一个操作数,折叠从右至左。

例子:

template<typename... Args>
auto sum(Args... args) {return (args + ... + 0);  // 右折叠,初始值为 0
}

常见的应用场景

  • 参数包的求和、乘积。
  • 参数包中元素的逻辑与/或操作。
  • 结合可变参数模板,简化递归调用的代码。

应用示例对比:

#include <iostream>#方法1 输出函数不定方法
template< typename Last >
void log(Last param) {std::cout << "Output last param:"<< param << std::endl;
}template< typename First, typename... Paramlist >
void log(First v, Paramlist... args) {std::cout << "Traversal param:"<< v << std::endl;log(args...);
}#方法2 输出函数不定方法template<typename T, typename... Ts>
auto printf3(T value, Ts... args) {std::cout <<"printf3:" << value << std::endl;(void) std::initializer_list<T> {//(... op pack)//这是一个lambda 表达式,通过 [] 捕获 args,并对每个 args 执行输出操作://value... 展开参数包,将 args... 中的每一个元素都以 lambda 表达式的形式传递,并展开执行。每个 args 被捕获到 lambda 中,展开后生成多个语句。相当于: //std::cout << args1 << std::endl;//std::cout << args2 << std::endl; ...([&args] { std::cout << "Paramlist list:"<<args << std::endl;}(), value) ......};
}
//方法3 输出不定参数
template<typename ... T>
auto sum(T ... t) {return (0 + ... + t);//(t + ...) 是左折,表达式会依次进行累加操作,像这样展开(((t1 + t2) + t3) + t4) + ... ,
// 这样即使参数包为空,也返回初始值 0}int main() {log("Hi", "test", 123, 1.1);printf3("first", "second", 3, 4.4);std::cout << sum(1, 2, 3, 4, 5.1) << std::endl;return 0;
}
~          

通过折叠表达式,可以避免手动展开参数包的递归调用,简化代码编写,提升可读性。

相关文章:

C++ 折叠表达式

C 折叠表达式&#xff08;Fold Expression&#xff09;是在 C17 引入的一种语法&#xff0c;用于简化与可变参数模板的操作。折叠表达式的作用是对参数包&#xff08;parameter pack&#xff09;进行递归处理。 折叠表达式有四种类型&#xff1a; 一元左折叠 (Unary Left Fol…...

双控开关接入NVBoard

导入NVBoard git仓库&#xff1a;https://github.com/NJU-ProjectN/nvboard 按照ysyx手册的要求&#xff0c;初始化NVBoard项目。 由于GitHub在国外&#xff0c;可能会超时无响应&#xff1a; 解决方案是修改代理。 当前的运行环境是VM VirtualBox虚拟机&#xff0c;网卡是…...

聊一聊软件系统性能测试的重要性

目录 性能测试的分类 为什么要进行性能测试呢&#xff1f; 性能测试曲线对比参数 虚拟用户数 vs 时间: 响应时间 vs 虚拟用户数: 吞吐量 vs 虚拟用户数: 错误率 vs 虚拟用户数: 资源使用情况 vs 时间: 组合视图 上图曲线图关键点介绍 性能测试的重要性主要体现在以下…...

双十一有哪些好物值得入手?五款超值数码好物分享!

在如今这个科技飞速发展的时代&#xff0c;数码产品已经成为我们生活中不可或缺的一部分。双十一作为一年一度的购物狂欢节&#xff0c;为我们提供了一个绝佳的机会&#xff0c;可以以更优惠的价格入手心仪的数码好物。下面就为大家分享五款超值数码好物&#xff0c;让你的生活…...

uniapp监听滚动实现顶部透明度变化

效果如图&#xff1a; 实现思路&#xff1a; 1、使用onPageScroll监听页面滚动&#xff0c;改变导航条的透明度&#xff1b; 2、关于顶部图片的高度&#xff1a; 如果是小程序&#xff1a;使用getMenuButtonBoundingClientRect获取胶囊顶部距离和胶囊高度&#xff1b; 如果…...

Humanoid 3D Charactor_P08_Federica

3D模型(人形装备)女孩 “P08_联邦” 内容仅为3D人物模型。 图片中的背景和家具不包括在内。 由Blender制作 包括: 1. 人形机器人3D模型和材质。 2. “Unity-chan!”着色器。 性别:女 装备:人形 皮肤网格:4个骨骼权重 多边形: 20000~40000 纹理分辨率:2K纹理 混合形状:…...

TikTok直播推流不精准该怎么办?跟IP有关系吗?

TikTok&#xff0c;这款风靡全球的短视频社交平台&#xff0c;其直播功能已成为众多创作者与品牌宣传的利器。然而&#xff0c;不少用户却遭遇了直播推流不精准的难题&#xff0c;这直接影响到直播的曝光和互动效果。那么&#xff0c;面对这一问题&#xff0c;我们该如何应对&a…...

Docker Registry API best practice 【Docker Registry API 最佳实践】

文章目录 1. 安装 docker2. 配置 docker4. 配置域名解析5. 部署 registry6. Registry API 管理7. 批量清理镜像8. 其他 &#x1f44b; 这篇文章内容&#xff1a;实现shell 脚本批量清理docker registry的镜像。 &#x1f514;&#xff1a;你可以在这里阅读&#xff1a;https:/…...

便捷点餐:Spring Boot 点餐系统

第三章 系统分析 3.1 系统设计目标 网上点餐系统主要是为了用户方便对美食信息、美食评价、美食资讯等信息进行查询&#xff0c;也是为了更好的让管理员进行更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定…...

研一上课计划2024/9/23有感

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、学位课1.应用数理统计&#xff08;学3 开卷考试&#xff09;2.最优化方法&#xff08;学3 开卷考试&#xff09;3.新中特&#xff08;学2 三千五百字的品读…...

【H2O2|全栈】关于CSS(6)CSS基础(五)

目录 CSS基础知识 前言 准备工作 网页项目规范 创建项目 布局 补充一部分属性 outline border-radius 预告和回顾 后话 CSS基础知识 前言 本系列博客将分享层叠样式表&#xff08;CSS&#xff09;有关的知识点。 本期博客主要分享的是网页项目规范&#xff0c;ou…...

网页护眼宝——全方位解析 Chrome Dark Reader 插件

网页护眼宝——全方位解析 Chrome Dark Reader 插件 1. 基本介绍&#xff1a;Chrome 插件的力量与 Dark Reader 的独特之处 随着现代浏览器的功能越来越强大&#xff0c;Chrome 插件为用户提供了极大的定制化能力。从广告屏蔽、性能优化到页面翻译&#xff0c;Chrome 插件几乎…...

C++ 构造函数和析构函数抛出异常的详细说明

1. 构造函数 功能&#xff1a;用于初始化对象的成员变量和分配资源。抛出异常&#xff1a; 当构造函数抛出异常时&#xff0c;构造的对象不会被创建&#xff0c;分配的资源会被释放。这意味着在构造函数抛出异常后&#xff0c;对象的状态是未定义的&#xff0c;调用者需要处理…...

Unity开发绘画板——01.前言

在做这个之前其实是想研究一下在Unity中交互雪的实现&#xff0c;交互雪顾名思义就是可以进行交互的雪&#xff0c;玩家角色从雪上走过时雪被踩凹陷的效果&#xff1b;交互雪的一种实现方案就是将地面看做一个画板&#xff0c;将玩家角色的躯体看做笔刷&#xff0c;将角色经过的…...

Spring定时任务 - @Scheduled注解详解

文章目录 一、Scheduled注解二、参数详解2.1、CRON_DISABLED2.2、cron2.3、zone2.4、fixedDelay / fixedDelayString2.5、fixedRate / fixedRateString2.6、initialDelay / initialDelayString 三、总结3.1、fixedDelay、fixedRate 以下内容基于org.springframework:spring-con…...

超详细超实用!!!AI编程之cursor编写设计模式接口隔离原则实例(七)

云风网 云风笔记 云风知识库 一、设计模式接口隔离原则定义 客户端不应该被迫依赖于它不使用的方法&#xff0c;一个类对另一个类的依赖应该建立在最小的接口上。要为各个类建立它们需要的专用接口&#xff0c;而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。 接口…...

解决在Nignx下Thinkphp路由不生效问题

Nignx下Tp框架路由不生效 问题的原因在于ThinkPHP通过URL后缀匹配方法&#xff0c;默认没有后缀会尝试访问默认的index方法。 解决方案&#xff1a;在URL末尾添加/后缀或者修改路由配置文件route.php中的规则。 如果还是没解决建议换apache...

『功能项目』QFrameWork框架重构OnGUI【63】

我们打开上一篇62QFrameWork背包框架的项目&#xff0c; 上文将功能实现在一个脚本中 本章要做的事情让脚本实现背包框架思想 首先按照图示创建脚本&#xff1a; 创建脚本&#xff1a;Item.cs namespace QFramework {public class Item{//道具public string Key;public string …...

4款AI生成PPT工具推荐,提升工作效率

在如今的工作环境中&#xff0c;PPT制作是许多技术人员不可避免的任务&#xff0c;尤其是在汇报、展示技术方案、以及项目进展时。随着AI技术的快速发展&#xff0c;使用AI生成PPT成为了提高效率的一种新趋势。本文将介绍几款适合程序员、技术人员的AI生成PPT工具&#xff0c;帮…...

3.postman脚本语言、接口关联(json引用(变量)、脚本用正则表达式)、断言封装、自动化构造接口请求(Postman工具)

一、Postman的脚本语言 1.使用js语言 2.pm变量 pm.sendRequest():发送HTTP请求 二、自动化实现接口关联 1.JSON引用 2.正则表达式&#xff08;在test下编写如下脚本&#xff09; //获取响应 console.log(responseBody) //re的方式获取token let token responseBody.match(&quo…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

Python第七周作业

Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt&#xff0c;并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径&#xff0c;并创建logs目录&#xff08;若不存在&#xff09; 3.递归遍历目录data&#xff0c;输出所有.csv文件的路径…...

Java中栈的多种实现类详解

Java中栈的多种实现类详解&#xff1a;Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...

C++中vector类型的介绍和使用

文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...

Linux入门课的思维导图

耗时两周&#xff0c;终于把慕课网上的Linux的基础入门课实操、总结完了&#xff01; 第一次以Blog的形式做学习记录&#xff0c;过程很有意思&#xff0c;但也很耗时。 课程时长5h&#xff0c;涉及到很多专有名词&#xff0c;要去逐个查找&#xff0c;以前接触过的概念因为时…...

Linux【5】-----编译和烧写Linux系统镜像(RK3568)

参考&#xff1a;讯为 1、文件系统 不同的文件系统组成了&#xff1a;debian、ubuntu、buildroot、qt等系统 每个文件系统的uboot和kernel是一样的 2、源码目录介绍 目录 3、正式编译 编译脚本build.sh 帮助内容如下&#xff1a; Available options: uboot …...