当前位置: 首页 > 科技观察

高端知识点:折叠表情(我也是第一次知道)

时间:2023-03-19 22:04:05 科技观察

不知道大家有没有知道折叠表情,这里给大家介绍一下!最近才知道这个知识点。在C++中,可以更改折叠表达式轻松处理可变参数模板中的可变参数。我们来看看使用递归方法处理可变参数的传统代码:#includevoidprint(inti){std::cout<voidfunc(T1arg1,Tn...args){print(arg1);func(args...);}intmain(){func(2,3,4);std::cout<<"HelloWorld\n";}请注意,代码中需要有一个不带参数的func()来停止递归。很麻烦!使用折叠表达式,可以通过单一的函数模板实现上述功能,没有多余的函数,见代码:#includevoidprint(inti){std::cout<voidfunc(constT&...args){(print(args),...);std::cout<<"\n";}intmain(){func(1,2,3);std::cout<<"HelloWorld\n";}函数体中的三个点触发折叠。它为可变参数中的每个参数调用print(),每次调用print()时用逗号分隔。比如对于func(1,2,3),函数中的折叠表达式会展开成这样:(print(1),(print(2),print(3)));使用另一个例子来合并:#includetemplatevoidfunc(constT&...args){((std::cout<templateintsum(constT&v,constTn&...values){return(v+...+values);}templateintsum2(constTn&...values){return(...+values);}intmain(){std::cout<templateintsum(constT&v,constTn&...values){return(v+...+values);}intmain(){sum();std::cout<<"HelloWorld\n";}错误如图:长度为0,但是你可以也可使用折叠表达式,但不能与加减等运算符结合使用。它只能与逻辑与、逻辑或、逗号结合使用。例如:#includetemplatedoubleallTrue(constValues&...values){return(...&&values);}templatedoubleanyTrue(constValues&...values){return(...||values);}intmain(){std::cout<