程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++實現類似Common Lisp的多參數加法和比較

c++實現類似Common Lisp的多參數加法和比較

編輯:C++入門知識

在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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved