在CL裡我們可以這樣:
1 $ sbcl 2 * (+ 1 2 3) 3 6 4 * (< 1 2 3) 5 T 6 * (< 2 3 1) 7 NIL 8 *
從簡單的方面看, CL的+和<就是一個接收多參數的函數,有點類似cpp的add(1,2,3)和less(1,2,3)這樣.
所以當C++11開始有了變參模板以後, 就可以玩多參數的加法和多參數比較了
1 #include <functional> 2 template<typename O, typename A,typename B> 3 bool cmp(O o, A a,B b){ 4 return o(a, b); 5 } 6 template<typename O, typename A,typename B,typename... C> 7 bool cmp(O o,A a,B b,C... c){ 8 return o(a, b) and cmp(o,b,c...); 9 } 10 template<typename O, typename A,typename B> 11 A reduce(O o, A a,B b){ 12 return o(a, b); 13 } 14 template<typename O, typename A,typename B,typename... C> 15 A reduce(O o,A a,B b,C... c){ 16 return reduce(o,o(a, b),c...); 17 } 18 19 bool foo(int a,int b,int c,int d){ 20 return cmp(std::less<int>(), a,b,c,d); 21 } 22 int bar(int a,int b,int c,int d){ 23 return reduce(std::plus<int>(), a,b,c,d); 24 }
可能有人會說,這不是坑爹麼, 先不管寫法比CL的丑, 你還遞歸調用了,簡直弱爆了.....
讓我們來看看真相(clang):
1 foo(int, int, int, int): # @foo(int, int, int, int) 2 cmpl %esi, %edi 3 jge .LBB0_1 4 cmpl %edx, %esi 5 setl %sil 6 cmpl %ecx, %edx 7 setl %al 8 andb %sil, %al 9 ret 10 .LBB0_1: 11 xorl %eax, %eax 12 ret 13 14 bar(int, int, int, int): # @bar(int, int, int, int) 15 addl %esi, %edi 16 leal (%rdi,%rdx), %eax 17 addl %ecx, %eax 18 ret
和手寫的完全沒差噢, 稍微是丑一點,不過你看下CL的匯編, 肯定比C++的慢....(逃
最後,這有啥用?
多參數加法似乎是沒啥用處了,還不如寫a+b+c+d呢
多參數比較還行
a < b and b < c and c < d