c++20 模板 lambda 的用例是什么?
What is the use case for c++20 template lambdas?
我们在 C++20 之前就有通用的 lambda 表达式,可以写出这样的东西。
auto l = [](auto a, auto b)
{
return a+b;
};
然后 C++20 引入了模板 lambda,我们可以在其中编写类似这样的东西
auto l = []<typename T>(T a, T b)
{
return a+b;
};
或者这个
auto l = []<typename T>(T a, auto b)
{
return a+b;
};
有人可以解释一下有什么区别吗?
更具体地说,哪些模板 lambda 可以实现 C++20 之前的泛型 lambda 无法实现的目标?
auto l = [](auto a, auto b)
可以使用两个完全不同的参数调用此 lambda。 a
可以是 int
,b
可以是 std::string
。
auto l = []<typename T>(T a, T b)
必须使用两个类型相同的参数调用此 lambda。 T
,就像在常规模板中一样,只能是一个特定的类型。
这是主要区别。在 C++20 之前,您可能可以使用 static_assert
实现大部分相同的事情,但这简化了它。
我发现有用的一个用例是立即调用
[]<std::size_t... Is>(std::index_sequence<Is...>)
{
// ...
}(std::make_index_sequence<N>());
pre-template lambda,你必须创建辅助函数。
我们在 C++20 之前就有通用的 lambda 表达式,可以写出这样的东西。
auto l = [](auto a, auto b)
{
return a+b;
};
然后 C++20 引入了模板 lambda,我们可以在其中编写类似这样的东西
auto l = []<typename T>(T a, T b)
{
return a+b;
};
或者这个
auto l = []<typename T>(T a, auto b)
{
return a+b;
};
有人可以解释一下有什么区别吗?
更具体地说,哪些模板 lambda 可以实现 C++20 之前的泛型 lambda 无法实现的目标?
auto l = [](auto a, auto b)
可以使用两个完全不同的参数调用此 lambda。 a
可以是 int
,b
可以是 std::string
。
auto l = []<typename T>(T a, T b)
必须使用两个类型相同的参数调用此 lambda。 T
,就像在常规模板中一样,只能是一个特定的类型。
这是主要区别。在 C++20 之前,您可能可以使用 static_assert
实现大部分相同的事情,但这简化了它。
我发现有用的一个用例是立即调用
[]<std::size_t... Is>(std::index_sequence<Is...>)
{
// ...
}(std::make_index_sequence<N>());
pre-template lambda,你必须创建辅助函数。