本文共 1426 字,大约阅读时间需要 4 分钟。
所谓泛型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强化了这一能力,使得泛型闭包成为可能。
可以说,泛型lambda大大加强了C++语言中因单态lambda的引入而有所增强的FP(函数型编程)能力。
- #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;
- }
-
-
-
-
-
-
-
-
-
-
-
转载: http://blog.csdn.net/zwvista/article/details/41144649