如何调用 lambda 模板?

Posted

技术标签:

【中文标题】如何调用 lambda 模板?【英文标题】:How to invoke a lambda template? 【发布时间】:2019-11-06 00:48:10 【问题描述】:

我能够使用 gcc 编译以下代码:

template<typename... Pack>
auto func(Pack... x) 
    return (x + ...) ;


template<typename... Pack>
auto lamd = [](Pack... x) 
    return (x + ...) ;
;

我可以使用 func(1,2,3) 调用函数模板,但在使用 lamd(1,2,3)lamd&lt;int&gt;(1,2,3) 调用 lambda 时出现错误。

【问题讨论】:

你应该看看:***.com/q/3575901 应该是lamd&lt;int, int, int&gt;(1,2,3) @Jarod42 这很聪明! :) 【参考方案1】:

对于 lambda,您可以使用 auto 将其设为 generic lambda。

auto lamd = [](auto... x) 
    return (x + ...) ;
;

从 C++20 开始,您可以使用显式模板参数列表,但请注意模板参数列表仍然与 lambda 的 operator() 一起使用,就像 auto 参数的用法一样。例如

auto lamd = []<typename... Pack>(Pack... x) 
    return (x + ...) ;
;

然后您可以将其称为lamd(1,2,3)

LIVE

【讨论】:

好答案。只是好奇 - 我一般可以使用模板化的 lambda 吗? @Nujufas 答案已修改。【参考方案2】:

第二个定义是变量模板。它没有将 lambda 的 operator() 定义为模板,而是将参数包用于 operator() 的参数类型。生成的operator() 是实例化变量的闭包类型的常规成员函数。这里不能推导模板参数。

因此,当您编写 lamd&lt;int&gt; 时,该变量将获得带有 operator()(int) 的闭包类型,而不是可使用 3 个整数调用的类型。

如前所述,您可以改用通用 lambda。

在 C++20 中,如果您需要命名和推断 lambda 的参数类型,可以使用以下语法:

auto lamd = []<typename... Pack>(Pack...) 

将运算符定义为模板,接受参数包,并为模板参数推导敞开大门。

【讨论】:

【参考方案3】:

没有像 lambda 模板这样的东西。 lambda 表达式始终是唯一的新类型。特别是,它不是一个可用于实例化实际函数的模板。

但是,lamdba 提供的函数调用运算符可以是模板。你也可以免费获得语法:

auto lamd = [](auto... x) 
    return (x + ...) ;
;

请注意,C++2a 将为通用 lambda 提供额外的支持和明确性,并允许您

auto lambda = []<typename...T>(T&& ...args)  /* ... */ ;

但这不会影响您在这里遇到的问题。

【讨论】:

以上是关于如何调用 lambda 模板?的主要内容,如果未能解决你的问题,请参考以下文章

Lambda 函数调用函数模板参数的静态函数失败

无法通过自定义 cloudformation 资源调用 lambda 函数

在Lambda函数中查找请求的URL

如何创建可变参数泛型 lambda?

如何创建一个可变的通用lambda?

从通用 lambda 调用 `this` 成员函数 - clang vs gcc