当前位置:首页 >> 编程开发 >> Visual C++ >> 内容

c++实现类似Common Lisp的多参数加法和比较

时间:2014/11/11 作者:平凡之路 来源:xuhantao.com 浏览:

在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.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

相关文章
  • 没有相关文章
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 徐汉涛(www.xuhantao.com) © 2024 版权所有 All Rights Reserved.
  • 部分内容来自网络,如有侵权请联系站长尽快处理 站长QQ:965898558(广告及站内业务受理) 网站备案号:蒙ICP备15000590号-1