将lambda函数传递给泛型函数C ++

时间:2014-11-24 00:14:10

标签: c++ lambda

我正在使用分而治之的代码。它只是对数组的元素求和: 编辑:没有内联lamda的代码。我想要的是使用二进制操作op,以便我可以在代码中使用任何二进制操作(不仅仅是sum)。例如,传递一个名为op:

的参数
long reduce_rec(const long *A,long low,long high,myfunclambdahere op)
{
    long result;
    long n = high - low;
    if (n == 0){
      return 0;
    }

    else if(high - low == 1){
      return A[low];
    }
    else{
       long mid=(low+high)/2;
       long a,b;

       a = reduce_rec(A,low,mid);
       b = reduce_rec(A,mid,high);
       //result = a + b;
         result = myfunclambdahere(a,b);
    }
    return result;
}

现在,我想使用此函数,以便可以使用传递给我的函数的任何运算符op(二元运算符)。我读到这可以用lambda函数完成,但我在C ++中并不熟悉它。

他们给我以下模板

template <class Assoc_comb_op>
value_type reduce_rec(Assoc_comb_op op, long *source, const value_type lo, const value_type hi) {:

但我不知道如何使用lambdas以及如何编码这种行为。有人可以向我解释一下吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

Lambda作为参数通过std :: function规范传递给类型安全。

#include <functional>

long reduce_rec(const long *A, long low, long high,
                const std::function<long(long, long)>& op)
{
    long result;
    long n = high - low;
    if (n == 0){
      return 0;
    }

    else if(high - low == 1){
      return A[low];
    }
    else{
       long mid=(low+high)/2;
       long a,b;

       a = reduce_rec(A, low, mid, op);
       b = reduce_rec(A, mid, high, op);
       //result = a + b;
       result = op(a,b);    // lambda call here
    }
    return result;
}


int caller()
{
    auto lambda = [](long a, long b){ return (a + b) * (a - b); };

    return reduce_rec(nullptr /*your data*/, 10, 1110, lambda);
}