c++实现雷同Common Lisp的多参数加法和较量
在CL里我们可以这样:
$ sbcl * (+ 1 2 3) 6 * (< 1 2 3) T * (< 2 3 1) NIL *
从简朴的方面看, CL的+和<就是一个吸收多参数的函数,有点雷同cpp的add(1,2,3)和less(1,2,3)这样.
所以当C++11开始有了变参模板今后, 就可以玩多参数的加法和多参数较量了
#include <functional> template<typename O, typename A,typename B> bool cmp(O o, A a,B b){ return o(a, b); } template<typename O, typename A,typename B,typename... C> bool cmp(O o,A a,B b,C... c){ return o(a, b) and cmp(o,b,c...); } template<typename O, typename A,typename B> A reduce(O o, A a,B b){ return o(a, b); } template<typename O, typename A,typename B,typename... C> A reduce(O o,A a,B b,C... c){ return reduce(o,o(a, b),c...); } bool foo(int a,int b,int c,int d){ return cmp(std::less<int>(), a,b,c,d); } int bar(int a,int b,int c,int d){ return reduce(std::plus<int>(), a,b,c,d); }
大概有人会说,这不是坑爹么, 先不管写法比CL的丑, 你还递归挪用了,的确弱爆了…..
让我们来看看真相(clang):
foo(int, int, int, int): # @foo(int, int, int, int) cmpl %esi, %edi jge .LBB0_1 cmpl %edx, %esi setl %sil cmpl %ecx, %edx setl %al andb %sil, %al ret .LBB0_1: xorl %eax, %eax ret bar(int, int, int, int): # @bar(int, int, int, int) addl %esi, %edi leal (%rdi,%rdx), %eax addl %ecx, %eax ret
和手写的完全没差噢, 稍微是丑一点,不外你看下CL的汇编, 必定比C++的慢….(逃
最后,这有啥用?
多参数加法好像是没啥用处了,还不如写a+b+c+d呢
多参数较量还行
a < b and b < c and c < d