cod*_*101 90 c++ generic-lambda c++14 c++20
c ++ 14引入了通用lambdas,可以编写以下内容:
auto func = [](auto a, auto b){
return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
Run Code Online (Sandbox Code Playgroud)
很明显,这个通用lambda func
就像模板化函数func
一样有效.
为什么C++委员会决定为通用lamda添加模板语法?
Que*_*tin 106
C++ 14泛型lambdas是一种非常酷的生成仿函数的方法operator ()
,它看起来像这样:
template <class T, class U>
auto operator()(T t, U u) const;
Run Code Online (Sandbox Code Playgroud)
但不是这样的:
template <class T>
auto operator()(T t1, T t2) const; // Same type please
Run Code Online (Sandbox Code Playgroud)
也不是这样的:
template <class T, std::size_t N>
auto operator()(std::array<T, N> const &) const; // Only `std::array` please
Run Code Online (Sandbox Code Playgroud)
也不是这样的(尽管实际使用起来有点棘手):
template <class T>
auto operator()() const; // No deduction
Run Code Online (Sandbox Code Playgroud)
C++ 14 lambdas很好,但是C++ 20允许我们毫不费力地实现这些情况.
Ant*_*ier 30
由于您可以在C++ 20中使用模板化lambda,因此您可以比SFINAE表达式更容易地限制类型:
auto lambda = []<typename T>(std::vector<T> t){};
Run Code Online (Sandbox Code Playgroud)
这个lambda只适用于矢量类型.
Ham*_*a.S 19
新的"熟悉的模板语法"在C++ 20 lambda表达式出台使得结构,如
for_types
和for_range
可行的,相比于C++ 17层的替代方式更具有可读性.
在C++ 14和C++ 17通用lambda上可以完成的另一个有趣的事情是operator()
通过显式传递模板参数直接调用 :
auto l = [](auto){ };
l.template operator()<int>(0);
Run Code Online (Sandbox Code Playgroud)
auto l = []<typename T>(){ };
l.template operator()<int>();
Run Code Online (Sandbox Code Playgroud)
上面的C++ 14例子是没用的:没有方法operator()
可以引用lambda体中提供的类型 而不给参数命名和使用 decltype
.此外,即使我们可能不需要它,我们也不得不通过论证.
C++ 20示例显示了如何在lambda的主体中轻松访问T,并且现在可以任意模拟nullary lambda.这对于上述编译时结构的实现非常有用