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

來源:互聯網
上載者:User

在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

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。