所谓泛型lambda。就是在形參声明中使用auto类型指示说明符的lambda。
比方
auto lambda = [](auto x, auto y) {return x + y;};依据C++14标准,这一lambda与下面代码作用同样。
struct unnamed_lambda { template<typename T, typename U> auto operator()(T x, U y) const {return x + y;} }; auto lambda = unnamed_lambda();C++14的泛型lambda能够被看做C++11的(单态)lambda的升级版。单态lambda相当于普通函数对象。
而泛型lambda则相当于带模板參数的函数对象。或者说相当于带状态的函数模板。两者相比,能够推出下面结果:
- 单态lambda在函数内使用,可以捕获外围变量形成闭包,作用相当于局部函数。泛型lambda强化了这一能力,其作用相当于局部函数模板。
- 单态lambda可以服务于高阶函数(參数为函数的函数),作用相当于回调函数。泛型lambda强化了这一能力。使得泛型回调成为可能。
- 单态lambda可以作为函数返回值,形成柯里化函数(闭包),用于lambda演算。
泛型lambda强化了这一能力,使得泛型闭包成为可能。
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; int main() { // 泛型局部函数 auto f = [](auto x, auto y) { return x + y; }; cout << f(1, 3) << endl; cout << f(string{}, "abc") << endl; // 泛型回调函数 auto f2 = [](auto e) { cout << e << ","; }; vector<int> v1{1, 2, 3}; vector<string> v2{"a", "b", "c"}; for_each(v1.begin(), v1.end(), f2); cout << endl; for_each(v2.begin(), v2.end(), f2); cout << endl; // 泛型闭包 auto f3 = [](auto a) { return [=]() mutable { return a = a + a; }; }; auto twice1 = f3(1); cout << twice1() << endl; cout << twice1() << endl; auto twice2 = f3(string{"a"}); cout << twice2() << endl; cout << twice2() << endl; } /* 4 abc 1,2,3, a,b,c, 2 4 aa aaaa */