可变参模板之折叠表达式

一概述:
折叠表达式,Fold Expressions,C++17
目的:计算某个值(表达式的结果当然是一个值)
该值得特殊性在于:它与所有可变参有关,而不是与单独某个可变参有关。需要所有可变参都参与计算,才能求出该值。
分类:
折叠表达式有四种格式:一元左折、一元右折,二元左折、二元右折。
注意,每种格式的折叠表达式都需要用圆括号括住。
左折:就是参数从左侧开始计算
右折:参数从右侧开始计算

二:范例
2.1:一元右折

#include<iostream>
using namespace std;
template <typename... T>
auto val(T... args)
{
    //格式: (一包参数 运算符 ...)
    return (args - ...); //一元右折,圆括号不能省略,否则出现编译错误
}
int main(int argc, char* argv[])
{
    //计算方式:( 参数1  运算符  ( ... (参数N-1  运算符  参数N)))
    auto sum = val(1, 2, 6); //一元右折(unary right fold)
    //(1-(2-6))
    std::cout << sum << std::endl; //5
    return 0;
}

2.2:一元左折

#include<iostream>
using namespace std;
template <typename... T>
auto val(T... args)
{
    return (... - args); //圆括号不能省略,否则出现编译错误,一元左折
}
int main(int argc, char* argv[])
{
    //一元左折(unary left fold)
    //格式: (... 运算符 一包参数)
    //计算方式:((( 参数1  运算符  参数2) 运算符  参数3)....运算符 参数N)
    //((1-2)-6)
    auto sum = val(1, 2, 6); 
    std::cout << sum << std::endl; //-7
    return 0;
}
#include<iostream>
using namespace std;
void print(int i)
{
    std::cout << i << ' ';
}
template <typename... T>
void func(const T&... args)
{
    //(print(args), ...);
    (..., print(args));
    std::cout << '\n';
}
int main()
{
    func(1, 2, 3);
}

2.3:二元右折
二元右折(binary right fold)
格式:(一包参数 运算符 … 运算符 init)
计算方式:(参数1 运算符 (…(参数N 运算符 init )))

#include<iostream>
template <typename... Ts>
auto sum(Ts... ts)
{
    //操作对象有两个,一个是0,一个是ts,
    //...位于右边,所以为二元右折
     return (ts + ... + 0);
}
int main()
{
    sum();
}

2.4:二元左折
二元左折(binary left fold)
格式:(init 运算符 … 运算符 一包参数)
计算方式:(((init 运算符 参数1) 运算符 参数2) … 运算符 参数N)
init表示 一个初始的东西,它可能是一个值,也可能是个其他东西。

#include<iostream>
using namespace std;
template <typename... Ts>
auto sum(Ts... ts)
{
    //操作对象有两个,一个是0,一个是ts,
    //...位于左边,所以为二元左折
    return (0+ ... + ts); 
}
int main()
{
    sum();
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值