(C++模板编程):折叠表达式、可变参表达式

目录

折叠表达式

可变参表达式

折叠表达式

  • 目的:计算某个值(表达式的结果当然是一个值)
  • 该值得特殊性在于:它与所有可变参有关,而不是与单独某个可变参有关。 需要所有可变参都参与计算,才能求出该值。
  • 折叠表达式有四种格式
    • 一元左折、一元右折,二元左折、二元右折
  • 注意,每种格式的折叠表达式都需要用圆括号括住
  • 左折:就是参数从左侧开始计算  
  • 右折:参数从右侧开始计算
template <typename... T>
auto add_val(T... args)
{
	return (... + args); //圆括号不能省略,否则出现编译错误,一元左折
}
  • 调用输出
cout << add_val(10, 20, 30) << endl;  //输出为 60

折叠表达式列表

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

案例1

template <typename... T>
auto sub_val_left(T... args)
{
	return (... - args); //一元左折
}
template <typename... T>
auto sub_val_right(T... args)
{
	return (args - ...); //一元右折
}
  • 应用
cout << sub_val_left(10, 20, 30,40) << endl;  //-80:((10-20)-30)-40
cout << sub_val_right(10, 20, 30, 40) << endl; //-20:10-(20-(30-40))

案例2

template <typename... T>
auto sub_val_left_b(T... args)
{
	return (220 - ... - args); //二元左折:220就是init
}

template <typename... T>
void print_val_left_b(T... args)
{
	(cout << ... << args); //一元左折,但init是cout,运算符代表的是 <<
}
  • 应用
cout << sub_val_left_b(10, 20, 30, 40) << endl; //120:(((220-10)-20)-30)-40
print_val_left_b(10, "abc", 30, "def"); //10abc30def

案例3

template <typename... T>
auto sub_val_right_b(T... args)
{
	return (args - ... - 220); //二元右折
}
  • 应用
cout << sub_val_right_b(10, 20, 30, 40) << endl; //输出 200;10-(20-(30-(40-220)))

可变参表达式

template <typename... T>
auto print_result(T const& ... args)
{
	(cout << ... << args) << " 结束" << endl;
	return (... + args); //计算一下参数和值
}
  • 调用
cout << print_result(10,20,30,40) << endl;
  • 输出

每个参数扩大两倍

template <typename... T>
void  print_calc(T const& ... args)
	{
		cout << print_result(2 * args...) << endl;  //“2 * args...“就是可变参表达式
    // print_result(2 * args...) 等价于 print_result(2 * 10, 2*20, 2*30,2*40)  ;

		//print_result(2 * args); //不行
		//print_result(args... * 2);  //不行
		//print_result(args * 2...); //不行
		//print_result(args * 2 ...); //可以
		//print_result((args * 2) ...); //可以
		//print_result(args + args...); //可以,等价于print_result(10+10,20+20,30+30,40+40);

	}

}
  • 调用
print_calc(10, 20, 30, 40)
  • 输出:

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值