所谓泛型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
*/

C++14尝鲜:Generic Lambdas(泛型lambda)的更多相关文章

  1. C++17尝鲜

    https://cloud.tencent.com/developer/article/1351910 [译]C++17,optional, any, 和 variant 的更多细节 用户261520 ...

  2. Windows 10 周年版尝鲜

    早在今年的 Build 大会上,微软就开始宣传最新的 Windows 10 周年版更新,炫了不少特技,直到昨天(2016/8/2 PST)才正式放出,相关新闻可以参考这里,正式的版本为 Version ...

  3. 微信团队分享:Kotlin渐被认可,Android版微信的技术尝鲜之旅

    本文由微信开发团队工程是由“oneliang”原创发表于WeMobileDev公众号,内容稍有改动. 1.引言   Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发( ...

  4. Java 8特性尝鲜:新新IO

    Java 8特性尝鲜:新新IO 在这个专题前面的文章中,我们已经看到,使用Java8的lambda表达式对现有的JDK1.2 I/O库的提升,主要是可以使用lambda表达式来构造java.io.Fi ...

  5. 【翻译】五步快速使用LINQPad尝鲜StreamInsight

    StreamInsight  学习地址:http://www.cnblogs.com/StreamInsight/archive/2011/10/26/StreamInsight-Query-Seri ...

  6. 小程序新能力-个人开发者尝鲜微信小程序

    个人开发者的福利 微信小程序,刚听到这个新名词的时候,我就兴冲冲的去找入口,看看自己能不能搞个微信小程序的HelloWorld,毕竟能在微信上把自己写的一些小工具跑起来还是满炫酷的. 没想,网上一查, ...

  7. 【响应式】foundation栅格布局的“尝鲜”与“填坑”

      提到响应式,就不得不提两个响应式框架--bootstrap和foundation.在标题上我已经说明白啦,今天给大家介绍的是foundation框架. 何为"尝鲜"?就是带大伙 ...

  8. Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例

    前言:由于之前没有接触过Hibernate框架,但是最近看一些博客深深被它的"效率"所吸引,所以这就来跟大家一起就着一个简单的例子来尝尝Spring全家桶里自带的JPA的鲜 Spr ...

  9. Linux下尝鲜IDE Rider .NET又一开发利器

    RiderRS 扯淡:很多人说:jetbrains出品,必属精品,jetbrains确实出了不少好东西,但是他的产品总感觉越用越慢,我的小Y430P高配版也倍感压力,内存占用率高. Multiple ...

随机推荐

  1. 微信小程序-简易计算器

    代码地址如下:http://www.demodashi.com/demo/14210.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...

  2. iOS-各种动画特效

    概述 广播跑马灯/弹幕/直播点赞/烟花/雪花等动画特效, 后续增加~ 详细 代码下载:http://www.demodashi.com/demo/10674.html 一.实现功能 1. 广播跑马灯 ...

  3. Linux下一个简单守护进程的实现 (Daemon)

    在Linux/UNIX系统引导的时候会开启很多服务,这些服务称为守护进程(也叫Daemon进程).守护进程是脱离于控制终端并且在后台周期性地执行某种任务或等待处理某些事件的进程,脱离终端是为了避免进程 ...

  4. Linux命令-服务管理命令:chkconfig

    chkconfig --list 查看服务自启动状态列表,等同于查看服务列表 设置某一个服务为自启动服务: chkconfig 服务名 on 修改服务的启动级别为3,,5 查看某一个服务时候已经运行了 ...

  5. 记一次400错误引发的血案(URL中特殊符号的转义/400 bad request错误)

    django+nginx+uwsgi部署的站点访问某个URL时发生了400 bad request的错误,而使用django自带的开发版的web server时没有遇到此问题.初步判断是nginx或u ...

  6. 学习WCF笔记之二

    一.学习文章http://www.cnblogs.com/iamlilinfeng/archive/2012/09/25/2700049.html 二.步骤 学习WFC,按照大神的文章一步步学习,不过 ...

  7. tomcat在debug模式启动直接提示:弹框无法启动,无报错信息;但直接启动的话,就会有报错信息

    今天运行项目,Debug模式启动Tomcat,直接弹框:无法启动(翻译,因为后来整理,所以都忘记当时的截图) 后来尝试直接start,发现不弹框了,但是console有报出错信息. 类似以下错误 20 ...

  8. 机器学习(3):支持向量机(SVM)

    1. 背景:      1.1 最早是由 Vladimir N. Vapnik 和 Alexey Ya. Chervonenkis 在1963年提出      1.2 目前的版本(soft margi ...

  9. java的IO总结(一)

    Java的IO流是实现输入输出的基础,这里所说的流就是数据流,大部分的与流相关的类放在Java.io包下. 一,Java的流分类 按照不同的分类方式可以把流分成不同的类型,下面我们从不同的角度对流进行 ...

  10. unity camera aspect

    camera的aspect默认是与screen保持一致,可以通过脚本将其设为指定值,如下: using UnityEngine;using System.Collections; public cla ...