在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);}
更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/
可能有人會說,這不是坑爹麼, 先不管寫法比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