现代 C++ 编程实战
吴咏炜
前 Intel 资深软件架构师
34199 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
加餐 (1讲)
现代 C++ 编程实战
15
15
1.0x
00:00/00:00
登录|注册

38 | 折叠表达式:高效的编译期展开

结合律和运算符顺序
参数数量影响展开方式
圆括号、运算符、...
参数包
折叠表达式版本
传统递归函数
make_index_sequenceindex_sequence_for 的使用
print_tuple 函数实现
逗号折叠表达式应用
利用短路规则简化代码
checked_exec 函数实现
is_any_null 函数实现
参数包为空的合法性
提供初值
参数包为空的处理
逗号运算符
等价性分析
短路求值行为
特殊处理空参数包
展开规则
语法要点
递归简化示例
体会折叠表达式的便利性
不使用折叠表达式实现 checked_exec
代码简化
编译期展开
C++17 特性
编译期遍历
返回值检查
空指针检查
二元折叠
逗号的折叠
与和或的折叠
一元折叠
支持一元和二元折叠
简化编译期递归代码
适用于可变模板参数
参考资料
课后思考
内容小结
折叠表达式的应用场景
基本用法
折叠表达式概述
折叠表达式:高效的编译期展开

该思维导图由 AI 生成,仅供参考

你好,我是吴咏炜。
当我在写第 18 讲“应用可变模板和 tuple 的编译期技巧”时,有朋友就建议可以讨论一下折叠表达式 [1]。不过,在那时候我对折叠表达式并没有什么实际应用经验,觉得它用处不大,于是就略过了。幸好我只是没有写,而没有乱加评论,否则就图欧图森破(too old, too simple)了。很多功能,只有在你真正需要到它、又掌握如何使用的时候,你才会觉得真正有用。很多 C++ 里看似用处不大的特性,都是这种情况(当然也不是所有,否则就不会有对特性的废弃和删除了)。
跟之前一样,我们还是通过具体的例子来看一下折叠表达式的作用和表达能力。

基本用法

一元折叠

第 18 讲我举过这样一个编译期递归的例子:
template <typename T>
constexpr auto sum(T x)
{
return x;
}
template <typename T1, typename T2,
typename... Targ>
constexpr auto sum(T1 x, T2 y,
Targ... args)
{
return sum(x + y, args...);
}
而使用折叠表达式的话,我们可以把代码简化成下面这个样子:
template <typename... Args>
constexpr auto sum(Args... args)
{
return (... + args);
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

C++17引入了折叠表达式,这是一种高效的编译期展开技术,能够在编译期对参数包进行展开操作。本文首先介绍了折叠表达式的基本用法,包括一元折叠、与和或的折叠以及逗号的折叠,并通过具体的例子展示了其在编译期递归和参数求和等方面的应用。其次,详细讨论了一元左折叠和一元右折叠的展开规则,以及与和或运算符的短路规则对折叠表达式展开的影响。此外,介绍了二元折叠的概念及其在参数输出等场景中的应用。最后,提出了折叠表达式在空指针检查等实际应用场景中的优势,通过简洁的代码实现了对多个指针是否为空的检查。总的来说,折叠表达式作为一种编译期展开的功能,能够在保持代码简洁的同时实现复杂的参数包展开操作,为C++编程带来了更高效的编译期计算能力。文章还提供了一些具体的例子和代码实现,帮助读者更好地理解和应用折叠表达式。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++ 编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 孙新
    最近刷了两三遍的课,也逐渐了解了一些语法细节。但是因为现有的项目基本没有模板编程的部分,所以比较困惑。就是好的模板编程代码结构设计是什么样的,有什么优秀开源项目推荐的吗?

    作者回复: 课程里我也展示了不少代码了。还是看看如何在项目里真正用起来吧。用起来才会有感觉。 标准库本身就是一个不错的参考。我觉得 Clang 的标准库 libc++ 可读性最好。

    2022-06-13
    2
  • Milittle
    赞一个
    2022-06-05
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部