博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lambda
阅读量:4298 次
发布时间:2019-05-27

本文共 1426 字,大约阅读时间需要 4 分钟。

所谓泛型lambda,就是在形参声明中使用auto类型指示说明符的lambda。比如
[cpp] 
  1. auto lambda = [](auto x, auto y) {
    return x + y;};  
根据C++14标准,这一lambda与以下代码作用相同。
[cpp] 
  1. struct unnamed_lambda  
  2. {  
  3.   template<typename T, typename U>  
  4.     auto operator()(T x, U y) const {
    return x + y;}  
  5. };  
  6. 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(函数型编程)能力。
[cpp] 
  1. #include <iostream>  
  2. #include <string>  
  3. #include <vector>  
  4. #include <algorithm>  
  5. using namespace std;  
  6.   
  7. int main() {  
  8.     // 泛型局部函数  
  9.     auto f = [](auto x, auto y) { return x + y; };  
  10.     cout << f(1, 3) << endl;  
  11.     cout << f(string{}, "abc") << endl;  
  12.   
  13.     // 泛型回调函数  
  14.     auto f2 = [](auto e) { cout << e << ","; };  
  15.     vector<int> v1{1, 2, 3};  
  16.     vector<string> v2{
    "a""b""c"};  
  17.     for_each(v1.begin(), v1.end(), f2); cout << endl;  
  18.     for_each(v2.begin(), v2.end(), f2); cout << endl;  
  19.   
  20.     // 泛型闭包  
  21.     auto f3 = [](auto a) {  
  22.         return [=]() mutable { return a = a + a; };  
  23.     };  
  24.     auto twice1 = f3(1);  
  25.     cout << twice1() << endl; cout << twice1() << endl;  
  26.     auto twice2 = f3(string{
    "a"});  
  27.     cout << twice2() << endl; cout << twice2() << endl;  
  28. }  
  29.   
  30. /* 
  31. 4 
  32. abc 
  33. 1,2,3, 
  34. a,b,c, 
  35. 2 
  36. 4 
  37. aa 
  38. aaaa 
  39. */  

转载: http://blog.csdn.net/zwvista/article/details/41144649

你可能感兴趣的文章
C指针声明解读之左右法则
查看>>
一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
查看>>
iOS 如何放大按钮点击热区
查看>>
ios设备唯一标识获取策略
查看>>
获取推送通知的DeviceToken
查看>>
Could not find a storyboard named 'Main' in bundle NSBundle
查看>>
CocoaPods安装和使用教程
查看>>
Beginning Auto Layout Tutorial
查看>>
block使用小结、在arc中使用block、如何防止循环引用
查看>>
iPhone开发学习笔记002——Xib设计UITableViewCell然后动态加载
查看>>
iOS开发中遇到的问题整理 (一)
查看>>
Swift code into Object-C 出现 ***-swift have not found this file 的问题
查看>>
为什么你的App介绍写得像一坨翔?
查看>>
RTImageAssets插件--@3x可自动生成@2x图片
查看>>
iOS开发的一些奇巧淫技
查看>>
常浏览的博客和网站
查看>>
Xcode 工程文件打开不出来, cannot be opened because the project file cannot be parsed.
查看>>
点击button实现Storyboard中TabBar Controller的tab切换
查看>>
Xcode 的正确打开方式——Debugging
查看>>
打包app出现的一个问题
查看>>