c++实现雷同Common Lisp的多参数加法和较量
当前位置:以往代写 > C/C++ 教程 >c++实现雷同Common Lisp的多参数加法和较量
2019-06-13

c++实现雷同Common Lisp的多参数加法和较量

c++实现雷同Common Lisp的多参数加法和较量

在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);
}

大概有人会说,这不是坑爹么, 先不管写法比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

    关键字:

在线提交作业