既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
当在C++17中使用模板或变参模板时,您可能需要将模板参数包中的多个值组合为单个值,例如求和、平均值、最大值等等。在这种情况下,您可以使用C++17中引入的折叠表达式。
折叠表达式是一种新的语言特性,它使得可以对包含若干个参数的可变参数模板进行操作,同时将其所有参数合并成一个值。这个新特性的语法形式是((pack op)… ),其中pack是一个参数包,op是一个二元操作符。这个语法形式可以用于多种操作符,例如加、乘、逗号等。 例如,如果您有一个求和函数模板,可以像这样定义它:
template<typename... Args>
auto sum(Args... args) {
return (args + ...);
}
在这里,表达式 (args + …) 称为折叠表达式,其中+是一个二元操作符。这个函数将参数包args中的所有参数相加,并返回它们的总和。 您可以使用折叠表达式在变量模板中计算一个参数包的大小,例如:
template<typename... Args>
constexpr std::size_t size_of_pack = (sizeof(Args) + ...);
这个变量模板可以用来计算参数包args中所有类型的大小之和,并将其作为一个std::size_t类型的常量返回。
语法形式
折叠表达式共有四种语法形式,分别为一元的左折叠和右折叠,以及二元的左折叠和右折叠。
一元左折叠(unary left fold)
( ... op pack )
一元左折叠(... op E)展开之后变为 ((E1 op E2) op ...) op En
一元右折叠(unary right fold)
( pack op ... )
一元右折叠(E op ...)展开之后变为 E1 op (... op (EN-1 op En))
二元左折叠(binary left fold)
( init op ... op pack )
二元左折叠(I op ... op E)展开之后变为 (((I op E1) op E2) op ...) op En
二元右折叠(binary right fold)
( pack op ... op init )
二元右折叠(E op ... op I)展开之后变为 E1 op (... op (EN−1 op (EN op I)))
(1)语法形式中的op代表运算符,pack代表参数包,init代表初始值。
(2)不指定初始值的为一元折叠表达式,而指定初始值的为二元折叠表达式。
(3)初始值在右边的为右折叠,展开之后从右边开始折叠。而初始值在左边的为左折叠,展开之后从左边开始折叠。
(4)当一元折叠表达式中的参数包为空时,只有三个运算符(&& || 以及逗号)有缺省值,其中&&的缺省值为true,||的缺省值为false,逗号的缺省值为void()。
fold expression支持32种操作符:
- * / % ^ & | = < > << >> += -= = /= %= ^= &= |= <<= >>= == != <= >= && || , . ->*
使用实例
(1) 一元右折叠
从表达式右边开始fold,看它是left fold还是right fold我们可以根据参数包和…所在的位置来判断,当…在参数包args右边的时候就是right fold,示例如下:
template<typename... Args>
auto add\_val(Args&&... args)
{
return (args + ...);
}
auto t = add\_val(1,2,3,4); // return 1 + (2 + (3 + 4))
(2) 一元左折叠
当…在参数包args左边的时候就是left fold
template<typename... Args>
auto add\_val(Args&&... args)
{
return (... + args);
}
auto t = add\_val(1,2,3,4); // return ((1 + 2) + 3) + 4
注意事项:虽然对于操作符 ‘+’ 来讲,一元左折叠和一元右折叠结果一样。不过,并不是所有的操作符都这样,因为它们的结合顺序和优先级可能会影响结果。比如,如果你用减法或除法作为一元右折叠的操作符,那么你得到的结果可能和你预期的不一样。
例如,下面的代码定义了一个函数模板,分别使用一元左折叠和一元右折叠来计算参数包中所有元素的差:
template <typename ... Args >
![img](https://img-blog.csdnimg.cn/img_convert/32d06bc582af562c264bfe9af35f989f.png)
![img](https://img-blog.csdnimg.cn/img_convert/1af878a7aa1ca5a94aeca4fd61f920a4.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
dn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**