Welcome

首页 / 软件开发 / C++ / c++实现类似Common Lisp的多参数加法和比较

c++实现类似Common Lisp的多参数加法和比较2014-11-11在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, %edijge.LBB0_1cmpl%edx, %esisetl%silcmpl%ecx, %edxsetl%alandb%sil, %alret.LBB0_1:xorl%eax, %eaxret bar(int, int, int, int): # @bar(int, int, int, int)addl%esi, %edileal(%rdi,%rdx), %eaxaddl%ecx, %eaxret
和手写的完全没差噢, 稍微是丑一点,不过你看下CL的汇编, 肯定比C++的慢....(逃

最后,这有啥用?

多参数加法似乎是没啥用处了,还不如写a+b+c+d呢

多参数比较还行

a < b and b < c and c < d