问题标签 [generic-lambda]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
298 浏览

c++ - 通用 lambdas 和二进制大小/代码膨胀

当我们比较这段代码时,生成的二进制文件有什么区别:

...到此代码:

据我了解,struct代码创建了 3 个模板实例化operator(),所有这些实例化都在二进制文件中显示为符号。拉姆达呢?编译器创建一个类似于s. 但是如果它是一个未命名的类类型,它会在二进制文件中创建符号吗?

动机:我使用了一个模板繁重的库,我必须在其中启用/bigobj。我想避免这种情况,我想知道 lambdas 是否可以帮助防止模板代码膨胀。这是在标准中定义的,还是依赖于编译器实现?

0 投票
2 回答
2957 浏览

c++ - std::visit 的 C++17 示例中令人困惑的模板

std::visit()在 cppreference 中 查看页面时, https: //en.cppreference.com/w/cpp/utility/variant/visit ,我遇到了我无法理解的代码......

这是缩写版本:

overloaded上面声明的两行int main()是什么意思?

谢谢你的解释!

2019 Addition
在下面两位先生提供了详细的解释(非常感谢!)之后,我偶然发现了非常精美的书C++17 in Detail - Learn the Exciting Features of The New C++ Standard 中的相同代码!由 Bartłomiej Filipek。这么好的一本书!

0 投票
1 回答
33 浏览

c++ - 将参数传递给通用 lambda 时复制构造函数不正确

考虑这段代码:

这无法在godbolt.org上编译,gcc-7.3因为它试图复制Identity. 为什么应该?这是一个错误gcc吗?

gcc如果第二个参数是暂时的或只有一个参数,则不会抱怨。Identity当定义是 with(...)而不是时,它只抱怨一个参数(auto&&...)

0 投票
2 回答
210 浏览

java - 如何为泛型方法编写简洁的闭包?

我想编写一个具有泛型方法的功能性非泛型接口的实现。实现需要是内联闭包并且简洁。

作为一个简化的例子

这使

(实际上,参数将是一个泛型接口,其方法的返回类型为R。)

有没有一种解决方法,而不需要回到匿名内部类的冗长之处?

有一个明显相似的问题,“无法将具有泛型方法的功能接口转换为 lambda 表达式”,但这源于使用类型参数调用Integer而不是传统的 like T,并且 Jon Skeet 接受的答案说他不知道我的解决方案问题。

还有一个很长的讨论,“功能接口混乱”,无法回答这个问题。不可能是“这里最好使用冗长的匿名内部类”,可以吗?

0 投票
3 回答
476 浏览

c++ - 是否可以在 lambda 签名中使用通用模板变量?

假设您有一个函数,它采用std::vector任何类型并以某种方式处理它:

因为C++14,我们可以用 lambdas 实现同样的目标。在这种情况下,我们称它们为泛型 lambda,因为我们为它们引入了类似模板的推导:

但我们的选择对我来说似乎非常有限。假设我不仅要引入类型推导,还需要引入模板值。例如,让我们更改std::vectorstd::array

在处理模板函数时,我们可以引入一个模板值,它可以用来匹配参数的需要。整洁的。

我想用通用 lambda 实现相同的功能,但我做不到。

有没有办法向 lambda 表达式引入类似的推导值,以便任何std::arrays 都可以与所述 lambda 一起使用,类似于foo()上面函数的第二个版本?

编辑:正如Evg评论中所述,我的vector<auto>语法是非标准的 GCC 扩展。有关详细信息,请参阅此文档的答案

0 投票
1 回答
92 浏览

templates - 重载模板函数推演错误

我很难做到这一点。我想创建重载模板函数,使此类调用成为可能且正确(GMock):

一切都很好,除了这个断言:

当我提取函数本身以获得有意义的错误时:

我明白了:

模板功能如下:

错误指向函数#2,尽管它应该使用#4。

0 投票
2 回答
285 浏览

c++ - 使用 lambda 将可变参数转发给线程

我很难找到如何使用std::thread()lambdas。即,具有可变参数 lambda 通过转发接收参数。举个例子:

A.1:编译

A.2:编译

B.1:编译

B.2:不编译

我不明白:

  • 为什么std::thread()使用 (B) 的 (2) 版本不能编译而 (A.2) 可以编译?
  • 为什么(B.1)和(B.2)之间存在差异
0 投票
2 回答
957 浏览

c++ - 使用带有通用 lambda 的 std::invoke_result_t 时出现硬错误

我有一个类似容器的类,其方法与std::apply. 我想用const限定符重载此方法,但是当我尝试使用通用 lambda 调用此方法时,我从std::invoke_result_t. 我std::invoke_result_t用来推断方法的返回值以及对参数执行 SFINAE 检查。

使用 Clang 6.0 编译时的错误消息:

我不确定是否对std::invoke_result_tSFINAE 友好,但我认为这不是问题所在,因为我尝试用尾随返回类型替换它,例如:

并得到了类似的错误:

问题:

  1. 为什么会这样?更准确地说,为什么 lambda 的主体在重载决议期间被实例化,似乎是什么?
  2. 我该如何解决它?
0 投票
1 回答
45 浏览

visual-c++ - 通用 lambda 尾随返回类型中的函数范围名称无法编译 (MSVC)

给定以下代码片段,案例 1、2、3 和 4 在 Visual Studio 2017 (/std:c++14) 中编译,但案例 5 没有。这是怎么回事?

这是编译器的输出。

0 投票
4 回答
180 浏览

c++ - 使用带有 lambdas/bind 的成员函数实现中间件函数

我有一个函数,Post()它接受两个参数——一个std::string监听请求的路径和一个std::function<void(Request &, Response &)>处理传入请求的路径。请注意,我无法修改Post().

例如:

我试图通过中间件函数传递请求,然后转发到处理函数。

处理函数和中间件函数是成员函数。Post() 绑定的设置发生在同一类的成员函数中。

这有效:

但是,我连接了合理数量的请求,最好将其抽象为一个函数,因此我们可以调用,例如

m_server.Post("/wallet/open", router(openWallet));

我设法得到这样的东西,但我不知道在使用成员函数时如何使它工作。如果一切都是免费功能,这将非常有用:

但是,我试图让它为成员函数工作是行不通的,我真的不知道错误消息告诉我什么:

路由器功能本身就可以工作。我认为问题是我没有在this. 我尝试这样做:

但后来我收到一个关于“指向成员的参数数量错误”的错误。

这是一个复制问题的最小示例:

谢谢。抱歉帖子太长了。