在C+中添加两个lambda函数+; 我试图添加两个C++ lambda函数。我的意思是:
假设有两个函数在C+中添加两个lambda函数+; 我试图添加两个C++ lambda函数。我的意思是:,c++,function,lambda,visual-studio-2013,functional-programming,C++,Function,Lambda,Visual Studio 2013,Functional Programming,假设有两个函数f和g,每个函数都有一个或多个参数,比如f(x,y)和g(x,y)。我想将它们添加到一个新函数h中,如下所示: h = f + g h(x,y) = f(x,y) + g(x,y) 评估工作应该是这样的: h = f + g h(x,y) = f(x,y) + g(x,y) 到目前为止,我已经尝试了以下代码,但它不起作用。末端的“cin”正好在那里,以防止控制台自动关闭 #include <iostream> #include <functional>
f
和g
,每个函数都有一个或多个参数,比如f(x,y)
和g(x,y)
。我想将它们添加到一个新函数h中,如下所示:
h = f + g
h(x,y) = f(x,y) + g(x,y)
评估工作应该是这样的:
h = f + g
h(x,y) = f(x,y) + g(x,y)
到目前为止,我已经尝试了以下代码,但它不起作用。末端的“cin”正好在那里,以防止控制台自动关闭
#include <iostream>
#include <functional>
using namespace std;
function<int (int,int)> add(function<int(int, int)> g, function<int(int, int)> f)
{
return [&](int x, int y)->int{return g(x, y) + f(x, y); };
}
int main()
{
int i = 0;
function<int (int,int)> sum = [](int x, int y)->int { return x + y; };
function<int (int,int)> mul = [](int x, int y)->int { return x * y; };
cout << sum(1, 2) << endl;
cout << mul(3, 4) << endl;
function<int(int, int)> s = add(sum, mul);
cout << s(2, 3) << endl;
cin >> i;
}
#包括
#包括
使用名称空间std;
功能添加(功能g、功能f)
{
return[&](intx,inty)->int{returng(x,y)+f(x,y);};
}
int main()
{
int i=0;
函数和=[](int x,int y)->int{return x+y;};
函数mul=[](intx,inty)->int{return x*y;};
这很微妙
function<int (int,int)> add(function<int(int, int)> g, function<int(int, int)> f)
{
return [&](int x, int y)->int{return g(x, y) + f(x, y); };
// ^-- This here
}
函数添加(函数g、函数f)
{
return[&](intx,inty)->int{returng(x,y)+f(x,y);};
//^--这里是
}
您通过引用捕获g
和f
,并将这些引用存储在您返回的std::function
中。但这些是对函数局部变量的引用,因此它们在您返回时会挂起。因此,您的代码只是具有未定义的行为
一个简单的修复方法是通过值[=]捕获
注意:std::function
不是lambda,它用性能成本包装lambda。相关:我个人总是指定我捕获的数字:这可能会防止您犯一些错误。对我来说,这与强键入相同。如果函数参数声明为引用,则通过引用捕获会正确工作吗?例如。g、 add(函数&g、函数&f)
?@ApproachingDarknessFish-在即时调用上下文中正确。这些引用仍然可以挂起。由于这些不是常量左值引用,现在传入lambda变得更加麻烦。我不喜欢绝对语句,但对于长寿命的std::function
,按值捕获是明智的选择做错事。