C++11——Lambda

如果代码里面存在大量的小函数,而这些函数一般只被一两处调用,那么不妨将它们重构成Lambda表达式,也就是匿名函数。作用就是当你想用一个函数,但是又不想费神去命名一个函数。

Lambda与仿函数

Lambda的本质是一个特殊的,匿名的类类型。他是一个带有operator()的类,即仿函数。

仿函数

仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。但注意仿函数不是函数而是类,他是通过重载了()运算符而拥有函数的行为

基本用法

  1. 通过类实现加法
class AddNum{
	public:
	AddNum(int num) : num_(num) {};
	int  addNum(int x) const{
		return num_ + x;
	}
	private:
		int num_;
}
// 调用
auto add_num = AddNum(10);
auto x = add_num.addNum(5);
  1. 仿函数实现:
class AddNum{
	public:
	AddNum(int num) : num_(num) {};
	int operator()(int x) const{
		return num_ + x;
	}
	private:
		int num_;
}
// 调用
auto add_num = AddNum(10);
auto x = add_num(5);

Lambda函数用法

  1. 基本用法:
    [capture](params)->ret {body};
  • [capture]指定在可见域范围内lambda表达式代码内可见的参数。
    • [] 不捕获任何变量。
    • [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)。
    • [=] 捕获外部作用域中所有变量,并作为副本copy在函数体中使用(按值捕获)。
    • [=,&foo] 按值捕获外部作用域中所有变量,并按引用捕获 foo 变量。
    • [bar]按值捕获 bar 变量,同时不捕获其他变量。
    • [this] 捕获当前类中的 this 指针,让 lambda 表达式拥有和当前类成员函数同样的访问权限。如果已经使用了 & 或者 =,就默认添加此选项。捕获 this 的目的是可以在 lamda 中使用当前类的成员函数和成员变量。
  • (params)指定lambda表达式内部变量定义。
  • ->ret是返回类型,如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。如果没有 return 语句,则类似 void f(…) 函数。
  • {body}是Lambda表达式主题结构。
  1. 示例
auto add_num2 = [lambda_num = 10](int x){return lambda_num + x};
auto lambda x = add_num2(5);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值