C++14嘗鮮:Generic Lambdas(泛型lambda),lambdaslambda
所謂泛型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大大加強了C++語言中因單態lambda的引入而有所增強FP(函數型編程)能力。
#include <iostream>#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;}/*4abc1,2,3,a,b,c,24aaaaaa*/</string></int>