高端知识点:折叠表达式(我也是第一次知道)

不知道大家以前了解折叠表达式不,这里介绍一下!

我也是最近才知道这个知识点,在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}

关于折叠表达式的介绍就到这里,打完收工!希望对大家有所帮助!

参考资料:

《Professional C++》

END
来源:程序喵大人
(0)

相关推荐

  • 使用C 20实现轻量级AOP库

    使用C 20实现轻量级AOP库

  • (7条消息) 【C/C++基础进阶系列】C/C++ 泛型

    [C/C++基础进阶系列]C/C++ 泛型 -- 万能引用.模板类型推断.完美转发 [1]万能引用与右值引用 #include <iostream> #include <vector ...

  • C++雾中风景16:std::make_index_sequence, 来试一试新的黑魔法吧

    C++14在标准库里添加了一个很有意思的元函数: std::integer_sequence.并且通过它衍生出了一系列的帮助模板: std::make_integer_sequence, std::m ...

  • (3条消息) C++11/14/17

    目录 环境准备 被弃用的特性 常量字符串赋值需要使用const char* 与C的兼容性 语言可用性的强化 类型推导 区间迭代 列表初始化 模板增强 面对对象增强 语言运行期的强化 Lambda表达式 ...

  • c++中using的用法

    c++中using的用法

  • 他来了,他来了,C 17新特性精华都在这了

    程序喵之前已经介绍过C++11的新特性和C++14的新特性(点击对应文字,直接访问),今天向亲爱的读者们介绍下C++17的新特性,现在基本上各个编译器对C++17都已经提供完备的支持,建议大家编程中尝 ...

  • C 如何装饰函数实现代码最大程度复用

    0 前言 Hello,大家好,欢迎来到『自由技艺』的 C++ 系列专题.代码重用,尽可能避免冗余代码是程序员的一项必备技能,今天就来给大家介绍其中一种:函数装饰器.在设计模式中,与它对应的是类的装饰器 ...

  • 再展实力?华为或将发布竖向折叠屏新机,定位高端

    目前智能手机的同质化越来越严重了,甚至说盖上logo都无法分辨出是哪个品牌的产品.很多大厂们都开始把目光投向折叠屏手机中,比如说三星.华为.小米在此前都推出过折叠屏手机.最近,又有消息曝光,称华为可能 ...

  • 高端故宫主题折叠本再开售:联想YOGA C940这外观贵1500元值吗?

    在联想轻薄本的产品序列里,YOGA C940拥有独一无二的折叠设计以及超轻薄机身,一直是非常有卖点的产品.也正因为有卖点,尽管产品价格略高但仍然非常吸引人,毕竟不是什么用户都会一味追求便宜.那如果让这 ...

  • “楼宇经济”稳步增长!青岛39座“亿元楼”集聚高端要素

    "亿元楼"是指单体税收过亿的商务楼宇, "亿元楼"的数量是衡量区域发展程度. 高端要素聚集能力的直观标准. 目前市南区.市北区.李沧区"亿元楼&quo ...

  • 上海龙湖春江天越:通过建筑打造高端楼盘

    建筑物的高密度无疑对发展中的城市非常重要,但只有将建筑物融入生活并建立社区,城市生活才能真正健康和可持续. 因为当人们被限制在自己的生活空间中时,人们通常很难与他人交流,甚至彼此相见.当您在街上行走时 ...

  • 大英:全力打造高端化学新材料产业集群

    近年来,大英全面贯彻落实全省关于加快构建"5 1"现代产业体系决策部署,推动培育万亿级能源化工产业集群,坚持产业链招商,特色化.产业化发展,化学新材料产业初具规模,形成了以石墨烯. ...

  • 欧洲发布:蔚来NIO将在挪威销售智能高端电动汽车

    蔚来 NIO 正在挪威开展其欧洲业务.该公司成立于 2014 年,旨在将 NIO 确立为全球品牌,而挪威市场则标志着 NIO 踏入欧洲之旅的第一步. "从一开始,我们就是一家着眼于全球的公司 ...

  • 全行业大涨81%,高端美妆的私域竞争

    36岁的李驿南(化名)是上海一家互联网公司的创始人,去年圣诞节前的一天,她在上海陆家嘴的海蓝之谜门店买了面霜.眼部精华等多件产品. 买单时美容顾问发现,这位客人对产品如数家珍,之前却没有任何购买记录. ...

  • 青年高端人才抗打击能力不强

    青年高端人才生活现状调查[青年高端人才抗打击能力不强]对外经济贸易大学教授廉思课题组:青年高端人才事业发展相对平稳,职业流动多为行业内流动,属于"稳健型"群体.该群体重视学科知识的 ...

  • 美亚宝贝无忧,这款高端儿童意外险很炸!

    相信很多人去医院看病,都经历过候诊大厅人多到没有座,很多人窝在角落的墙边一靠. 有时候去的晚了,前面能有几十人在排队,有时候还能碰上插队问诊的,别提有多烦躁了. 尤其是当孩子生病,抱着孩子在医院,有时 ...