zoukankan      html  css  js  c++  java
  • C++14尝鲜:Generic Lambdas(泛型lambda)

    所谓泛型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则相当于带模板參数的函数对象。或者说相当于带状态的函数模板。两者相比,能够推出下面结果:

    1. 单态lambda在函数内使用,可以捕获外围变量形成闭包,作用相当于局部函数。泛型lambda强化了这一能力,其作用相当于局部函数模板。
    2. 单态lambda可以服务于高阶函数(參数为函数的函数),作用相当于回调函数。泛型lambda强化了这一能力。使得泛型回调成为可能。

    3. 单态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;
    }
    
    /*
    4
    abc
    1,2,3,
    a,b,c,
    2
    4
    aa
    aaaa
    */
    
  • 相关阅读:
    centos 7 配置ip
    Linux下安装jmeter
    eclipse 高效快捷键大全
    eclipse中不能找到dubbo.xsd报错”cvc-complex-type.2.4.c“的 两种解决方法
    大型网站系统架构演化之路(转)
    程序员技术练级攻略
    JSP和servlet之间的传值(总结的很全面)
    正则表达式笔记
    cenos 安装nginx并添加到service
    mac os重装php
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6714481.html
Copyright © 2011-2022 走看看