异世相遇 Generic Lambda in C++20

偶遇

今日昨日在网上冲浪时偶然遇到lambda表达式的一种新语法,定睛一看,恰好能优雅地解决前段时间的纠结,遂记录之。

太长不看版直接前往今生(并不能跳转的链接)

前世

自C++11引入lambda表达式以来,lambda表达式就被引入了C++(逃

在此之后的C++14对其进行了第一次增幅,不仅捕获能力更强,泛化能力也不可同日而语,因此改头换面被称呼为generic lambda。以下是一种用法:


auto func = [](auto a, auto b) { return a + b; };

以上等价于


template 

auto func(T1 a, T2 b)

{

return a + b;

}

即使强如generic lambda in C++14也没有做到通常模板函数的泛化能力。以下形式即无法由lambda等价表示:


// case 1

template 

auto func(T a, T b) { ... }

// case 2

template 

auto func(std::array const& arr) { ... }

而以上case 2正是我所希望以lambda写成的等价形式。

今生

当今lambda表达式进一步支持模板参数,大概可以称为generic templated lambda吧(?)


auto lambda = [](T a) { ... };

  • 坏消息是:上述特性需要C++20支持,大多数生产环境未来可期

  • 好消息是:当前手到擒来的VS2019以及ubuntu 20.04中的gcc 9.3均可开启此特性

对于上面提到的两个case可以分别写做:


auto func = [](T a, T b) { ... };  // case 1

auto func = [](std::array const& arr) { ... };  // case 2

Refs

  1. What is the need of template lambda introduced in C++20 when C++14 already has generic lambda?

  2. Lambdas: From C++11 to C++20, Part 2

本文仅讨论lambda表达式的泛化能力,关于[]的捕获能力不在本文范围

你可能感兴趣的:(异世相遇 Generic Lambda in C++20)