折叠表达式

折叠表达式,第1张

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

auto sum1()
{
	return 0;
}

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


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


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

int main()
{
	cout << sum1(1, 2, 3, 5.5, 6) << endl;
	cout<<sum2(1, 2, 3, 5.5, 6) << endl;
	cout << sum3(1, 2, 3, 5.5, 6) << endl;
	system("pause");
	return 0;
}

结果:

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

一元左折

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

template<typename ...U>
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<typename ...U>
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<typename ...U>
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<typename ...U>
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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1353626.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-14
下一篇 2022-06-14

发表评论

登录后才能评论

评论列表(0条)

保存