lambda 表达式

本文介绍了C++0x中的Lambda表达式的使用方法,并通过std::for_each函数演示了Lambda的基本用法。此外,还详细解释了Lambda的格式、闭包特性及涉及this指针的使用。

C++0x 的语法还是比较简单。下面通过几个例子来介绍下。

先是通过 std::for_each 演示一个简单的例子:

 

?
std::for_each 和 lambda
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <vector>
#include <algorithm>
 
int main() {
 
     std::vector< int > my_vector({1, 2, 3, 4 ,5});
 
     std::for_each(my_vector.begin(), my_vector.end(),
             []( int value) { std::cout << value << std::endl; });
 
 
     return 0;
}

首先,是不是发现 my_vector 的构造函数怪怪的呢。因为C++0x支持一种从C带来的初始化列表概念,

语法类似于 C 的 int array[] = {1, 2, 3, 4 ,5}。关于这个详细介绍,有机会下次再介绍

1.Lambda 的格式

对于这里的 lambda:[](int value) { std::cout << value << std::endl; }

从这里看出,lambda 是以 [] 开头的匿名函数。这个lambda 仅仅把参数打印出来,是一个 void 的函数。

对于需要返回值的 lambad,格式如下:[](int a, int b) { return a + b;}

在这里,返回值的类型是 decltype(a + b),decltype是一个新关键词,用于在编译期推导出类型。

如果想强制设定返回值类型,可以这样编写:[](int a, int b) -> int { return a + b;}

这里把返回值设置为 int 型。

2. [] 的表示方式

C++ 的 lambad 是支持闭包的。那么,是通过 [] 来表示 lambda 的变量集合,即闭包。

 

?
[]的表示
1
2
3
4
5
6
7
8
[] //没有定义变量,使用未定义的变量会导致错误。
[a, &b] //a以传值方式传入,b以引用方式传入
[&] // 表示在 lambda所使用到的变量,皆以引用方式传入
[=] // 表示在 lambda所使用到的变量,皆以传值方式传入
[&, a] //表示 a 以传值方式传入,其他都是以引用方式传入
[=, &a] // 表示 a 以引用方式传入,其他都是以传值方式传入
 
如果企图修改以值传入的变量,则编译的时候会报错(gcc 4.5)

下面来看看一个闭包的lambda例子:

 

?
lambda的闭包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include <algorithm>
 
int main() {
 
     std::vector< int > my_vector({1, 2, 3, 4 ,5});
 
     int total = 0;
 
     std::for_each(my_vector.begin(), my_vector.end(),
         [&total]( int value) {
             total++;
         });
 
     std::cout << "total:" << total << std::endl;
 
     return 0;
}

这里的输出结果是: total:5

3.涉及 this 指针的使用

在成员函数中涉及到对象的 this 指针,必须显式地传入lambda函数,否则成员函数的lambda函数无法使用任何对象的变量或者函数,格式如下:

[this]() { this->call_function(); }

转载于:https://www.cnblogs.com/MrGreen/p/3269213.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值