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
*/
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值