问题标签 [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.
c++ - 通用 lambdas 和二进制大小/代码膨胀
当我们比较这段代码时,生成的二进制文件有什么区别:
...到此代码:
据我了解,struct
代码创建了 3 个模板实例化operator()
,所有这些实例化都在二进制文件中显示为符号。拉姆达呢?编译器创建一个类似于s
. 但是如果它是一个未命名的类类型,它会在二进制文件中创建符号吗?
动机:我使用了一个模板繁重的库,我必须在其中启用/bigobj。我想避免这种情况,我想知道 lambdas 是否可以帮助防止模板代码膨胀。这是在标准中定义的,还是依赖于编译器实现?
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。这么好的一本书!
c++ - 将参数传递给通用 lambda 时复制构造函数不正确
考虑这段代码:
这无法在godbolt.org上编译,gcc-7.3
因为它试图复制Identity
. 为什么应该?这是一个错误gcc
吗?
gcc
如果第二个参数是暂时的或只有一个参数,则不会抱怨。Identity
当定义是 with(...)
而不是时,它只抱怨一个参数(auto&&...)
。
java - 如何为泛型方法编写简洁的闭包?
我想编写一个具有泛型方法的功能性非泛型接口的实现。实现需要是内联闭包并且简洁。
作为一个简化的例子
这使
(实际上,参数将是一个泛型接口,其方法的返回类型为R
。)
有没有一种解决方法,而不需要回到匿名内部类的冗长之处?
有一个明显相似的问题,“无法将具有泛型方法的功能接口转换为 lambda 表达式”,但这源于使用类型参数调用Integer
而不是传统的 like T
,并且 Jon Skeet 接受的答案说他不知道我的解决方案问题。
还有一个很长的讨论,“功能接口混乱”,无法回答这个问题。不可能是“这里最好使用冗长的匿名内部类”,可以吗?
c++ - 是否可以在 lambda 签名中使用通用模板变量?
假设您有一个函数,它采用std::vector
任何类型并以某种方式处理它:
因为C++14
,我们可以用 lambdas 实现同样的目标。在这种情况下,我们称它们为泛型 lambda,因为我们为它们引入了类似模板的推导:
但我们的选择对我来说似乎非常有限。假设我不仅要引入类型推导,还需要引入模板值。例如,让我们更改std::vector
为std::array
:
在处理模板函数时,我们可以引入一个模板值,它可以用来匹配参数的需要。整洁的。
我想用通用 lambda 实现相同的功能,但我做不到。
有没有办法向 lambda 表达式引入类似的推导值,以便任何std::array
s 都可以与所述 lambda 一起使用,类似于foo()
上面函数的第二个版本?
编辑:正如Evg评论中所述,我的vector<auto>
语法是非标准的 GCC 扩展。有关详细信息,请参阅此文档的答案。
templates - 重载模板函数推演错误
我很难做到这一点。我想创建重载模板函数,使此类调用成为可能且正确(GMock):
一切都很好,除了这个断言:
当我提取函数本身以获得有意义的错误时:
我明白了:
模板功能如下:
错误指向函数#2,尽管它应该使用#4。
c++ - 使用 lambda 将可变参数转发给线程
我很难找到如何使用std::thread()
lambdas。即,具有可变参数 lambda 通过转发接收参数。举个例子:
A.1:编译
A.2:编译
B.1:编译
B.2:不编译
我不明白:
- 为什么
std::thread()
使用 (B) 的 (2) 版本不能编译而 (A.2) 可以编译? - 为什么(B.1)和(B.2)之间存在差异
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_t
SFINAE 友好,但我认为这不是问题所在,因为我尝试用尾随返回类型替换它,例如:
并得到了类似的错误:
问题:
- 为什么会这样?更准确地说,为什么 lambda 的主体在重载决议期间被实例化,似乎是什么?
- 我该如何解决它?
visual-c++ - 通用 lambda 尾随返回类型中的函数范围名称无法编译 (MSVC)
给定以下代码片段,案例 1、2、3 和 4 在 Visual Studio 2017 (/std:c++14) 中编译,但案例 5 没有。这是怎么回事?
这是编译器的输出。
c++ - 使用带有 lambdas/bind 的成员函数实现中间件函数
我有一个函数,Post()
它接受两个参数——一个std::string
监听请求的路径和一个std::function<void(Request &, Response &)>
处理传入请求的路径。请注意,我无法修改Post()
.
例如:
我试图通过中间件函数传递请求,然后转发到处理函数。
处理函数和中间件函数是成员函数。Post() 绑定的设置发生在同一类的成员函数中。
这有效:
但是,我连接了合理数量的请求,最好将其抽象为一个函数,因此我们可以调用,例如
m_server.Post("/wallet/open", router(openWallet));
我设法得到这样的东西,但我不知道在使用成员函数时如何使它工作。如果一切都是免费功能,这将非常有用:
但是,我试图让它为成员函数工作是行不通的,我真的不知道错误消息告诉我什么:
路由器功能本身就可以工作。我认为问题是我没有在this
. 我尝试这样做:
但后来我收到一个关于“指向成员的参数数量错误”的错误。
这是一个复制问题的最小示例:
谢谢。抱歉帖子太长了。