Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将lambda函数传递给泛型函数C++;_C++_Lambda - Fatal编程技术网

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

C++ 将lambda函数传递给泛型函数C++;,c++,lambda,C++,Lambda,我正在使用分而治之的方法编写代码。它只是对数组的元素求和: 编辑:没有内联lamda的代码。我想要的是使用二进制运算op,这样我就可以在代码中使用任何二进制运算(而不仅仅是求和)。例如,传递名为op的参数: long reduce_rec(const long *A,long low,long high,myfunclambdahere op) { long result; long n = high - low; if (n == 0){ return 0;

我正在使用分而治之的方法编写代码。它只是对数组的元素求和: 编辑:没有内联lamda的代码。我想要的是使用二进制运算op,这样我就可以在代码中使用任何二进制运算(而不仅仅是求和)。例如,传递名为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) {:
模板
值\u类型减少\u记录(关联\u组合\u操作,长*源,常量值\u类型lo,常量值\u类型hi){:
但是我不知道如何使用lambdas以及如何对这种行为进行编码。有人能给我解释一下吗


提前感谢

Lambda通过std::function specification作为参数传递,用于类型安全

#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);
}
#包括
长减记录(常数长*A、长低、长高、,
常量标准::函数和操作)
{
长期结果;
长n=高-低;
如果(n==0){
返回0;
}
否则如果(高-低==1){
返回一个[低];
}
否则{
中长=(低+高)/2;
长a,b;
a=减少(a、低、中、op);
b=减少(A、中、高、op);
//结果=a+b;
result=op(a,b);//在这里调用lambda
}
返回结果;
}
int调用者()
{
自动lambda=[](长a,长b){返回(a+b)*(a-b);};
返回reduce_rec(nullptr/*您的数据*/,101110,lambda);
}

那么,我如何实现这个行为?你能为此提供代码吗?试着在你的函数定义前面添加
模板
。然后在其他地方,定义一个lambda并将它传递给你的reduce函数:
auto mylambda=[x,y](int x,int y){return x+y;};reducerec(data,low,high,mylambda);
。别忘了更新函数实现,以便将lambda也传递给递归调用。didrec,您不需要捕获lambda参数。谢谢,如果我想执行max,那么我在aut lambda函数中使用return max(a,b),对吗?