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

[原创](Modern C++)现代C++的关键性概念: 通俗易懂的解释“折叠表达式(Fold expressions)“

[简介]
常用网名: 猪头三
出生日期: 1981.XX.XX
企鹅交流: 643439947
个人网站: 80x86汇编小站
编程生涯: 2001年~至今[共23年]
职业生涯: 21年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测

[序言]
随着现代C++11开始带来的模板参数包大量应用, 结合现代C++17带来的折叠表达式, 可以更简洁地处理一群参数包和操作. 这展示了现代C++在优化语法和提高编程效率方面的高度. 本文将通过通俗易懂的说明和代码示例, 帮助您快速熟练折叠表达式.

[语法详细解释]
1:一元右折叠 ( 包 op ... )           
2:一元左折叠 ( ... op 包 )
3:二元右折叠 ( 包 op ... op 初始化 )
4:二元左折叠 ( 初始化 op ... op 包 )

op    -    以下32个二元运算符中的任何一个:+ - * / % ^ & | = < > << >> += -= *= /= %= ^= &= |= <<= >>= == != <= >= && || , .* ->* 在二元折叠中,两个op必须相同.
包    -    包含未展开的"参数包"且在顶层不包含优先级低于强制转换的运算符(形式上, cast-expression)的表达式
初始化-    不包含未展开的"参数包"且在顶层不包含优先级低于强制转换的运算符(形式上, cast-expression)的表达式

[具体代码示例]

// 普通打印技巧
template<typename... Args>
void fun_printer_Ordinary(Args&&... args)
{
	(std::cout << ... << args ) << '\n';
}// End fun_printer_Ordinary()

// 高级打印技巧: 利用lambda
template<typename... Args>
void fun_printer_Lambda(Args&&... args)
{
	([&] {std::cout << args << '\n'; }(), ...);
}// End fun_printer_Ordinary()

// 其他高级技巧: 把折叠参数存放入vector容器
template<typename T, typename... Args>
void fun_vector_Pushback(std::vector<T>& v, Args&&... args)
{
	// 高于语法解释: (std::is_constructible_v<T, Args&&> && ...) 相当于 如下代码
	// std::is_constructible_v<T, Args[1]&&> && std::is_constructible_v<T, Args[2]&&> && std::is_constructible_v<T, Args[3]&&>
	// 多个std::is_constructible_v 的 && 运算
	static_assert((std::is_constructible_v<T, Args&&> && ...));

	(v.push_back(std::forward<Args>(args)), ...);

}// End fun_vector_Pushback()

int main()
{
	// 演示普通的打印技巧
	// 结果: 123abc
	fun_printer_Ordinary(1, 2, 3, "abc");

	// 高级打印技巧: 利用lambda
	// 结果:
	// 1
	// 2
	// 3
	// abc
	fun_printer_Lambda(1, 2, 3, "abc");

	// 其他高级技巧
	// 结果: 6 2 45 12 1 2 9
	std::vector<int> vector_Inttypes;
	fun_vector_Pushback(vector_Inttypes, 6, 2, 45, 12);
	fun_vector_Pushback(vector_Inttypes, 1, 2, 9);
	for (int int_Item : vector_Inttypes)
		std::cout << int_Item << ' ';

}

[总结]
折叠表达式是现代C++对参数包处理的最优雅方法, 可以大量减少手动输入和处理工作, 且让代码更加简洁和读易. 并且, 它和C++的其他高级特性(如lambda表达式)结合, 提供更加强大的功能性. 希望通过本文, 您能够对折叠表达式有更深入的了解, 并能自如展现在实际中. 


http://www.kler.cn/a/463851.html

相关文章:

  • 智慧工地解决方案 1
  • 38. 考古学家
  • mysql 忘记root密码 无密码登录系统 配置文件怎么改?
  • Eplan 布局图中的宏/设备/安装板比例缩放
  • Python 链接 Pcomm
  • PyTorch AMP 混合精度中grad_scaler.py的scale函数解析
  • javaEE-多线程进阶-JUC的常见类
  • 利用Java Swing图形组件和JDBC实现简易的ATM存取款机系统。
  • Go 语言:Jank 简客博客系统
  • 基于单片机的电子安全密码锁的设计初探
  • Linux硬盘分区 --- fdisk命令MBR分区、添加硬盘、lsblk命令
  • 电商项目-数据同步解决方案(四)商品下架同步更新ES索引库数据
  • 小程序发版后,强制更新为最新版本
  • WebRTC的线程切换
  • 【网络安全】系统0day分析
  • 基本算法——回归
  • Android 系统 Activity 系统层深度定制的方法、常见问题以及解决办法
  • 面试经典 150 题——数组/字符串(一)
  • Mono里运行C#脚本8—mono_image_storage_open打开EXE文件
  • 代码随想录算法训练营Day37 | 322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包、背包问题总结
  • C++笔记之C语言和C++中未初始化变量的默认值问题
  • WKWebView打开pdf文件乱码?各种方案整理。
  • HTML——42.自定义列表
  • 【python】unittest单元测试
  • 家教系统|Java|SSM|VUE| 前后端分离
  • Ethernet 系列(13)-- 基础学习::VLAN