栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

折叠表达式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

折叠表达式

先看看一个例子,这个例子中有三个求和函数sum1,sum2,sum3.

auto sum1()
{
	return 0;
}

template
auto sum1(T a, U... rest)
{	
	return a + sum1(rest...);
}


template
auto sum2(T a, U... rest)
{
	if constexpr(sizeof...(rest)>0)
	{
		return a + sum2(rest...);
	}
	else
	{
		return a;
	}
}


template
auto sum3(U... rest)
{
	return (... + rest);
}

int main()
{
	cout << sum1(1, 2, 3, 5.5, 6) << endl;
	cout< 

结果:

        上述代码中sum3就使用了折叠表达式,可以看到代码非常简洁,却也实现了相同的功能。
折叠表达式是c++17标准引入的,引入折叠表达式的主要目的是计算某个值,这个值的特殊在于:它与所有可变参有关,而不是于单独某个参数有关。
        折叠表达式一般有4种格式(注意每种格式都是用圆括号括起)。左折就是参数从左侧开始计算,右折就是参数从右侧开始计算。

一元左折

格式:(… 运算符 一包参数)
计算方式:(((参数1 运算符 参数2)运算符 参数3))…运算符 参数N)
示例:

template
auto sub_left(U...paras)
{
	return (... - paras);
}

int main()
{
	cout << sub_left(10, 20, 30, 40) << endl;
	system("pause");
	return 0;
}

结果:-80

一元右折

格式:(一包参数 运算符 …)
计算方式:参数1 运算符(参数2…(参数N-1 运算符 参数N))
示例:

template
auto sub_right(U...paras)
{
	return (paras - ...);
}

int main()
{
	cout << sub_right(10, 20, 30, 40) << endl;
	system("pause");
	return 0;
}

结果:-20

二元左折

格式:(init 运算符 … 运算符 一包参数)
计算方式:(((init 运算符 参数1)运算符 参数2)…运算符 参数N)
示例:

template
auto sub_left(U...paras)
{
	return (220 - ... - paras);
}

int main()
{
	cout << sub_left(10, 20, 30, 40) << endl;
	system("pause");
	return 0;
}

结果:120
((((220-10)-20)-30)-40)

二元右折

格式:(一包参数 运算符 … 运算符 init)
计算方式:(参数1运算符(…(参数N 运算符 init))
示例:

template
auto sub_right(U...paras)
{
	return (paras - ... - 220);
}

int main()
{
	cout << sub_right(10, 20, 30, 40) << endl;
	system("pause");
	return 0;
}

结果:200
10-(20-(30-(40-220)))=200

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960783.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号