偶遇
今日昨日在网上冲浪时偶然遇到lambda表达式的一种新语法,定睛一看,恰好能优雅地解决前段时间的纠结,遂记录之。
太长不看版直接前往今生(并不能跳转的链接)
前世
自C++11引入lambda表达式以来,lambda表达式就被引入了C++(逃
在此之后的C++14对其进行了第一次增幅,不仅捕获能力更强,泛化能力也不可同日而语,因此改头换面被称呼为generic lambda。以下是一种用法:
auto func = [](auto a, auto b) { return a + b; };
以上等价于
template <typename T1, typename T2>
auto func(T1 a, T2 b)
{
return a + b;
}
即使强如generic lambda in C++14也没有做到通常模板函数的泛化能力。以下形式即无法由lambda等价表示:
// case 1
template <typename T>
auto func(T a, T b) { ... }
// case 2
template <typename T, std::size_t N>
auto func(std::array<T, N> const& arr) { ... }
而以上case 2
正是我所希望以lambda写成的等价形式。
今生
当今lambda表达式进一步支持模板参数,大概可以称为generic templated lambda吧(?)
auto lambda = []<typename T>(T a) { ... };
-
坏消息是:上述特性需要C++20支持,大多数生产环境未来可期
-
好消息是:当前手到擒来的VS2019以及ubuntu 20.04中的gcc 9.3均可开启此特性
对于上面提到的两个case
可以分别写做:
auto func = []<typename T>(T a, T b) { ... }; // case 1
auto func = []<typename T, std::size_t N>(std::array<T, N> const& arr) { ... }; // case 2
Refs
本文仅讨论lambda表达式的泛化能力,关于
[]
的捕获能力不在本文范围
网友评论