当前位置: 首页 > 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…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...