• C++(17):折叠表达式


    C++17对可变长模板参数引入了折叠表达式,以简化对参数包的处理,也可以避免递归调用。

    C++17前如果想实现一个可变长参数相加,需要这样实现:

    1. #include <iostream>
    2. using namespace std;
    3. template<class T>
    4. auto add(T t)
    5. {
    6. return t;
    7. }
    8. template<class T, class ...Args>
    9. auto add(T t, Args... args)
    10. {
    11. return t + add(args...); //通过递归调用实现
    12. }
    13. int main()
    14. {
    15. cout<<add(1)<<endl; //输出:1
    16. cout<<add(1, 2)<<endl; //输出:3
    17. cout<<add(1, 2, 3)<<endl; //输出:6
    18. cout<<add(1, 2, 3, 4)<<endl; //输出:10
    19. return 0;
    20. }

    C++17的折叠表达式可以简化实现的方式:

    1. #include <iostream>
    2. using namespace std;
    3. template <class ... Ts>
    4. auto add(Ts ... ts)
    5. {
    6. return (... + ts); //折叠表达式
    7. }
    8. int main()
    9. {
    10. cout<<add(1)<<endl; //输出:1
    11. cout<<add(1, 2)<<endl; //输出:3
    12. cout<<add(1, 2, 3)<<endl; //输出:6
    13. cout<<add(1, 2, 3, 4)<<endl; //输出:10
    14. return 0;
    15. }

    折叠表达式支持 32 个操作符

    +-*/%^&
    |=<><<>>+=
    -=*=/=%=^=&=|=
    <<=>>===!=<=>=&&
    ||.*->*,

    语法形式

    折叠表达式共有四种语法形式。分别为一元的左折叠和右折叠,以及二元的左折叠和右折叠。

    1.一元右折叠(unary right fold)
            ( pack op ... )
            一元右折叠(E op ...)展开之后变为 E1 op (... op (EN-1 op EN))
    2.一元左折叠(unary left fold)
            ( ... op pack )
            一元左折叠(... op E)展开之后变为 ((E1 op E2) op ...) op EN
    3.二元右折叠(binary right fold)
            ( pack op ... op init )
            二元右折叠(E op ... op I)展开之后变为 E1 op (... op (EN−1 op (EN op I)))
    4.二元左折叠(binary left fold)
            ( init op ... op pack )
            二元左折叠(I op ... op E)展开之后变为 (((I op E1) op E2) op ...) op EN

    注:
    1.语法形式中的op代表运算符,pack代表参数包,init代表初始值。

    2.初始值在右边的为右折叠,展开之后从右边开始折叠。而初始值在左边的为左折叠,展开之后从左边开始折叠。

    3.不指定初始值的为一元折叠表达式,而指定初始值的为二元折叠表达式。

    4.当一元折叠表达式中的参数包为空时,只有三个运算符(&& || 以及逗号)有缺省值,其中&&的缺省值为true,||的缺省值为false,逗号的缺省值为void()。
     

  • 相关阅读:
    小程序样式问题
    在定义指针的时候,写成「int* p;」和「int *p;」哪个更好?
    dubbo启动之注册中心(Registry)
    Shiro-SpringBoot (一)
    android studio implementation包时报错
    如今传统企业如何做数字化转型?
    Go 限流器使用
    【人工智能】【Python】Matplotlib基础
    qian‘kun微服务配置vue3.2+ts+vite子应用教程
    攻防世界pwn题:Recho
  • 原文地址:https://blog.csdn.net/jiemashizhen/article/details/125544639