【C语言学习笔记】:折叠表达式

news2024/9/28 21:29:20

在C++中通过折叠表达式可以更容易的在可变参数模板中处理可变参数。

先看一下传统的使用递归方式来处理可变参数的代码:

#include <iostream>void print(int i) {    std::cout << i << " ";}void func() {}template<typename T1, typename... Tn>void func(T1 arg1, Tn... args) {    print(arg1);    func(args...);}int main() {    func(2, 3, 4);    std::cout << "Hello World \n";}

注意看代码里还需要有个不带参数的func()来停止递归。很麻烦!

而使用折叠表达式,通过单个函数模板就可以实现上述功能,不需要多余的函数,看代码:​​​​​​​

#include <iostream>void print(int i) {    std::cout << i << " ";}template<typename... T>void func(const T&... args) {    (print(args), ...);    std::cout << "\n";}int main() {    func(1, 2, 3);    std::cout << "Hello World \n";}

函数体中的三个点触发折叠。它会针对可变参数中的每个参数调用print(),对print()的每个调用用逗号分隔。

例如对于func(1, 2, 3),函数内的折叠表达式会展开成这样:​​​​​​​

(print(1), (print(2), print(3)));

再用一个例子巩固下:​​​​​​​

#include <iostream>template<typename... T>void func(const T&... args) {    ((std::cout << args << " "), ...);    std::cout << "\n";}int main() {    func(1, 2, 3);    std::cout << "Hello World \n";}

下面是折叠表达式展开后的形式:​​​​​​​

((std::cout << 1<< " "), ((std::cout << 2 << " "), (std::cout << 3 << " ")));

上面的示例中都是与逗号运算符结合使用,但实际上折叠可以和任何类型的运算符结合使用。例如与加号结合使用来计算所有值的和:​​​​​​​

#include <iostream>template<typename T, typename... Tn>int sum(const T& v, const Tn&... values) {    return (v + ... + values);}template<typename... Tn>int sum2(const Tn&... values) {    return (... + values);}int main() {    std::cout << sum(1, 2, 3, 4) << "\n";    std::cout << sum2(1, 2, 3, 4) << "\n";    std::cout << "Hello World \n";}

对于sum(1, 2, 3, 4),展开的形式如下:​​​​​​​

return (((1 + 2) + 3) + 4);

但这里有个问题,该函数的使用一定需要至少一个参数,否则将无法通过编译:​​​​​​​

#include <iostream>template<typename T, typename... Tn>int sum(const T& v, const Tn&... values) {    return (v + ... + values);}int main() {    sum();    std::cout << "Hello World \n";}

报错如图:

长度为0其实也可以使用折叠表达式,但不能和加减这种运算符结合使用,只能和逻辑与、逻辑或和逗号结合使用。例如:​​​​​​​

#include <iostream>template <typename... Values>double allTrue(const Values&... values) {     return (... && values); }template <typename... Values>double anyTrue(const Values&... values) {     return (... || values); }int main() {    std::cout << allTrue(1, 1, 0) << allTrue(1, 1) << allTrue() << "\n"; // 011    std::cout << anyTrue(1, 1, 0) << anyTrue(0, 0) << anyTrue() << "\n"; // 100}

 

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

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

相关文章

C++为什么能重夺年度语言?

目录一、爷青回1、年初依旧很多大新闻&#xff0c;其中一条就是TIOBE把年度编程语言颁给了C。2、这是什么概念&#xff1f;那一年Java的流行指数是14%。二、C为什么衰落三、C为什么重新流行1、C为什么重新流行起来了呢&#xff1f;2、C究竟做对了什么呢&#xff1f;3、根本原因…

Python入门自学进阶-Web框架——31、开发客户报名流程

完成客户报名的流程流程大体如下&#xff1a;在已有收集的客户信息基础上——>销售填写报名表&#xff08;报什么班、课程顾问&#xff09;——>自动生成一个链接&#xff0c;让学员填写——>学员填写个人信息&#xff0c;并上传身份照片&#xff0c;同意合同协议——…

墨天轮【第二届数据库掌门人论坛】圆满收官 | 含嘉宾精彩观点回顾

2月10日上午&#xff0c;墨天轮【2023春季发布会暨第二届数据库掌门人论坛】盛大开启&#xff0c;本次活动的主题为“新征程&#xff0c;向未来”&#xff0c;共包含2022年度中国数据库颁奖盛典、2022年度行业发展报告发布以及第二届数据库掌门人论坛三项议程。华为云数据库服务…

win10-右键打开windows terminal

文章目录windows terminal设置右键打开打开注册表添加一个右键选项新建一个项添加右键的名称和图标右键选项执行的命令测试windows terminal windows 新一代命命令行 设置右键打开 打开注册表 WinR 输入&#xff1a; regedit 定位&#xff1a; 计算机\HKEY_CLASSES_ROOT\Di…

中国第一份ERP系统用户实名口碑选型报告(选型宝重磅发布!)

01 报告目录 一、 报告概况 二、 ERP类厂商-用户实名口碑排行 三、 ERP类产品-用户实名口碑对比 四、 主流ERP产品简介 五、 ERP常用功能 六、 算法说明 七、 联系选型宝 02 报告概述 一、报告亮点 这是一份完全由用户实名点评生成的ERP系统选型报告。 报告由选…

关于 Eclipse 的一场 “三角关系”

上个世纪 90 年代&#xff0c;世界上的计算机要么不联网&#xff0c;要么在企业内部联网。但是&#xff0c;在互联网的概念下&#xff0c;计算机之间共享信息和资源的需求成为了必要。 1995 年 5 月&#xff0c;Java 横空出世。Java 的父亲是当时凭借 Solaris 操作系统风头正盛…

2023-02-16 学习记录--React-邂逅Redux(三)

React-邂逅Redux&#xff08;三&#xff09; “天道酬勤&#xff0c;与君共勉”——承接React-邂逅Redux&#xff08;二&#xff09;&#xff0c;让我们一起继续探索Redux的奥秘吧~☺️【今日新知识——异步action】 一、什么是异步action&#xff1f; action有两种形式&#x…

C#:Krypton控件使用方法详解(第二讲) ——kryptonCheckBox

今天介绍的Krypton控件中的kryptonCheckBox&#xff0c;这个控件和VS中带的CheckBox控件还是不一样的&#xff0c;下面介绍这个控件。kryptonCheckBox控件的外观属性如下图所示&#xff1a;Checked属性&#xff1a;对应的属性值为Bool类型有两个&#xff0c;当属性值为true时kr…

DHCP协议

DHCP协议 文章目录DHCP协议DHCP作用及特点DHCP服务IP分配的三种方式DHCP协议中的报文类型DHCP服务工作流程抓包参考动态主机配置协议 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;&#xff0c;提供了一种 插网即用的技术。DHCP是一个应用层协议。当我们将…

CANoe仿真工程开发

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、网络拓扑图二、数据库文件设计四、Panel设计五、CAPL代码实现六、Automation Sequences七、分析窗口设置八、Trace窗口与Logging九、Desktop布局十、工程运行…

【算法 | 例题简答】相关例题讲解

目录 简答题 计算题 时间复杂度的计算 递归算法计算 背包问题&#xff08;0-1背包问题&#xff09; 回溯法 动态规划法 编程题 用回溯法解方程 动态规划法解决蜘蛛吃蚊子 用分治法解决抛硬币问题 用二分法分两边求最大值 简答题 1、什么是算法&#xff1f;算法有哪…

Revit问题:Navisworks中导入的rvt模型角度不正确调整

一、Navisworks中导入的rvt模型角度不正确调整方法 通常情况下&#xff0c;我们做好一个Revit模型&#xff0c;有时候出于成果保护或者鉴于Revit自带的碰撞检测效果不够直观、Revit模型体量太大&#xff0c;需要一个轻量化的模型展示&#xff0c;我们通常情况下会使用Autodesk公…

【python】基于Socket的聊天室Python开发

基于Socket的聊天室Python开发一、Socket简述二、创建服务端Server2.1 创建服务端初始化2.2 监听客户端连接2.3 处理客户端消息三、创建客户端Client3.1 创建服务端初始化3.2 发送消息3.3 接收消息3.3 线程工作3.4 线程工作是不是挺好玩的呢&#xff1f;也可以作为课程设计哦&a…

【C++】Expression的学习笔记

关于不同类别表达式的举例&#xff0c;请参考博文《C 中的值类别》 1. 左值和右值的简单理解 左值对应了具有内存地址的对象&#xff0c;而右值仅仅是临时使用的值对象。&#xff08;引用自博文《C 中的值类别》&#xff09;左值有名称&#xff08;变量或常量名称&#xff09…

RFC7519规范-JWT - json web token

简介 什么是JWT(JSON Web Token) 在介绍JWT之前&#xff0c;我们先来回顾一下利用token进行用户身份验证的流程&#xff1a; 客户端使用用户名和密码请求登录服务端收到请求&#xff0c;验证用户名和密码验证成功后&#xff0c;服务端会签发一个token&#xff0c;再把这个to…

mybatis-spring-boot-starter中设定多数据源,并实现Durid的监控

实现功能&#xff1a; 1&#xff1a; 配置两个数据源&#xff0c;根据不同的mapper路径使用不同的数据连接 2 &#xff1a;使用Druid连接池 3&#xff1a;Druid 可监控多个数据源的sql执行操作 分析&#xff1a; 查看mybatis_spring_boot_stater中关于自动装配的类可知【如上…

基于动力学模型的无人驾驶车辆主动转向控制

章五 基于动力学模型的无人驾驶车辆主动转向控制 主动转向控制联合仿真 基于动力学模型的无人驾驶车辆主动转向控制 无人驾驶车辆模型预测控制第五章&#xff08;上&#xff09; 无人驾驶车辆模型预测控制第五章&#xff08;下&#xff09; 北理工无人驾驶车辆模型预测控制第4…

测试新版Android Studio的手机镜像效果

学更好的别人&#xff0c; 做更好的自己。 ——《微卡智享》 本文长度为669字&#xff0c;预计阅读2分钟 前言 春节刚上班&#xff0c;就开始了疯狂出差的节奏&#xff0c;期间发现Android Studio发布新的版本2022.1.1(Electric Eel)&#xff0c;里面两个更新的内容蓝牙模拟器和…

ChatGPT 帮我自动编写 Python 爬虫脚本

都知道最近ChatGPT聊天机器人爆火&#xff0c;我也想方设法注册了账号&#xff0c;据说后面要收费了。 ChatGPT是一种基于大语言模型的生成式AI&#xff0c;换句话说它可以自动生成类似人类语言的文本&#xff0c;把梳理好的有逻辑的答案呈现在你面前&#xff0c;这完全不同于…

2023美赛数学建模资料思路模型

美赛我们为大家准备了大量的资料&#xff0c;我们会在比赛期间给大家分析美题目和相关的思路 全文都是干货&#xff0c;大家仔细阅读&#xff0c;资料文末自取&#xff01; 首先我们来看美赛23年题型的一个变化&#xff1a; 美赛23年题目变化&#xff1a; A题&#xff1a;连…