问题标签 [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 投票
0 回答
145 浏览

c++ - 具有抽象父级的模板类的c ++通用lambda

我有以下情况:

我需要将它们存储起来,std::vector所以我引入了一个抽象父类,如下所示:

Derived继承自Base

所以现在我可以std::vector像这样存储它们:

现在在程序执行的某个时刻,我需要迭代m_Bases并根据某些条件选择一些并使用它们各自的m_Data,如下所示:

由于我不能这样做,因为T m_Datais member of Derivedand not Base,所以我引入了一个访问者向量:

现在,当我插入一个新Derived<T>的时,m_Bases我也会插入一个新的 lambda,m_DerivedVisitors这样我以后可以像这样调用:

现在Foo可能会Derived在访问者通用 lambda(我希望)中获得一个实例,如下所示:

现在,如果您有敏锐的眼光,您会发现这段代码存在一些问题。
我不知道第二个参数m_DerivedVisitors应该是什么类型。
现在它设置为,std::function<void(std::any)>&因为我不知道访问者的类型,因为它的参数应该是Derived模板类型,所以我尝试使用std::any 并且对于访问者本身,我使用了一个auto参数,使其成为通用 lambda:

我不确定如何使它工作。
如果有人能用代码示例解释如何做到这一点,我将不胜感激。

提前致谢。

更新:
我想到了一个我根本不喜欢的解决方案,但无论如何我都会提出,也许它可以帮助某人帮助我改进它或找到另一个解决方案。我们改成m_DerivedVisitors这样:

我们像这样推动它:

注意我们刮掉了auto visitor函数参数,我们现在调用一个静态 Visit方法,定义如下:

我在这个解决方案中看到的问题是我无法具体说明我使用的访问者。解决此问题的一种方法是m_DerivedVisitors再次更改为以下内容:

并像这样改变我们推送它的方式:

如您所见,我们必须将所有访问者定义为静态函数,并且我们必须使用id. 我们甚至不能这样做,std::unordered_map因为我们不能std::function指向模板函数。

现在,每当有东西想将派生类型用于特定任务时,我们都必须定义一个静态函数并将其添加到 switch case 并使用适当的id.

这不是唯一的问题。
最初在我的代码Foo中给出了一个模板 lambda 参数以及我想传递m_Data给它的方法,方法如下:

现在,为了使用我提出的解决方案来做到这一点,我必须存储fn一些静态/全局变量并在访问者函数中访问它,如下所示:

请注意,这不适用于捕获模板类型,Fn&& fn因为我不能拥有该类型的静态/全局变量,因为它完全是一个不同的范围。更不用说对于想要将其他变量引入访问函数的每种访问者,我都必须这样做,那是因为我不能像我最初的计划那样将 lambda 与捕获列表一起使用。

所以你可以看到这个解决方案根本不理想,它只是一个想法。
希望有人能想到更好的方法或指导我做其他事情。

0 投票
0 回答
168 浏览

java-8 - 带有 RadixSort、BucketSort、Java 8 的比较器接口

我有一个 Java 8 中的 SomeClass 列表,我想对列表进行排序。

举这个例子

名单

相反的顺序

但是,用RadixSort,订购 120000 怎么样BucketSort

(在我看来这是不可能的,但我需要保证安全)是否可以使用 RadixSort、BucketSort 实现 Comparator?

如果是,如何?

0 投票
2 回答
3121 浏览

c# - 异步 void lambda 表达式

一个快速的谷歌搜索会告诉你尽可能避免使用async void myMethod()方法。并且在许多情况下,有办法使之成为可能。我的问题基本上是这个最佳实践的一个分支:

下面的 lambda 表达式的计算结果是什么?

如果它变成了,async Task那么我们将遵循最佳实践。

但是,如果它评估为async void怎么办?

0 投票
1 回答
287 浏览

java - 从 IntStream,Java 8 返回 LinkedHashMap

我有这个代码。

对于每个time值 aList<TimePitchValue>都使用 name 生成listTimePitchValue,并且我希望将指定的关联listTimePitchValuebaseTime + timein 中指定的关联mapListTimePitchValue

为了支持

ChunkDTO班级

TimePitchValue班级

问题是,是否可以直接Map<Long, List<TimePitchValue>>从排序返回IntStream (没有先前的 createMap<Long, List<TimePitchValue>> mapListTimePitchValue = new LinkedHashMap<>();和后来的 put mapListTimePitchValue.put(baseTime + time, listTimePitchValue);

0 投票
1 回答
151 浏览

c++ - 为什么 g++ 10.1 抱怨头文件中的命名 lambda 而其他人没有?

我有一个带有命名 lambda 的头文件,用于测量某些函数的执行时间(lambda 部分是这个问题的结果How to Write a Lambda Wrapping a Function with Optional Return Value)。它驻留在我从多个翻译单元中包含的头文件中。这在 g++ 8 和 g++ 9 上运行良好。现在当我切换到 g++ 10.1 时,链接时出现错误。

请检查以下简化示例。

这是 Wandbox 中的示例:https ://wandbox.org/permlink/Sizb6txrkW5dkJwT 。

文件“Lambda.h”:

文件“Test1.cpp”:

文件“Test2.cpp”:

然后我像这样构建:

在 g++ 9.2 之前一切正常,但在 g++ 10.1 中,我收到以下错误消息:

为什么?如何使用 g++ 10.1 编译我的项目?我像使用模板函数一样使用命名的 lambda,因此我需要将命名的 lambda 写入头文件,以便能够在项目中的任何位置使用它,并且我不能以某种方式将声明与定义分开,对吗?

我期待着一个答案!

0 投票
2 回答
201 浏览

c++ - 递归函数的返回类型推导

最近,我阅读了Barry对这个问题Recursive lambda functions in C++11的回答:

基本上,y_combinator允许人们更轻松地编写递归 lambda 表达式(例如,无需删除 a std::function)。当我玩的时候y_combinator,我发现了一些奇怪的东西:

案例#1 和案例#3 编译良好,而案例#2 不编译。我使用 Clang 10.0 和 GCC 9.3 得到了相同的结果。对于案例 #2,Clang 说

  1. 案例#1 和案例#2 的结果有何不同?
  2. 为什么尾随返回类型会在案例 #2 和案例 #3 之间产生差异?

您可以在Wandbox上查看。

0 投票
2 回答
452 浏览

c++ - lambda 折叠表达式获取索引

有没有一种简单的方法可以将 As 的当前添加到index包含arg 它的 lambda 调用中,所以我不需要使用index++

0 投票
0 回答
60 浏览

c++ - MSVC 构造函数被窃听?

我正在使用最新版本的 MSVC、clang 和 gcc。最后两个接受以下代码,但 MSVC 拒绝它。MSVC 对吗?或者它是一个错误?

0 投票
0 回答
487 浏览

c++ - 我可以更改通用可变参数 lambda 的模板参数推导顺序吗?

以下面的代码为例,这是一个简化的例子:

一个函数接受一个通用的可变参数 lambda 并使用一组固定的参数调用它。然后这个 lambda 本身只是调用另一个具有匹配原型的函数/lambda。可以预料,在场景 2 中,当f被调用 inside时foo,编译器将推断params...为参数 pack {1, 1}

对于场景 #1,我使用另一个问答中的代码来推断可调用对象的数量。但是,如果这样的对象可以使用超过预定义的最大参数数量进行调用,则将其视为“可变参数”。详细地说,is_variadic_v将使用表达式 SFINAE 的一种形式,它试图调用具有可隐式转换为任何东西的“任意类型”的参数数量减少的函数对象。

现在的问题是,显然,编译器将在此元代码期间推导出 F(及其参数包),如果它是可变参数(例如在本例中),它将 F 推导出为采用虚拟参数的 lambda,即类似于main()::lambda(<arbitrary_type<0>, arbitrary_type<1>, arbitrary_type<2>, ..., arbitrary_type<N>>)如果 N 是上面的“可变限制”。现在params...推断为arbitrary_type<1>, arbitrary_type<2>, ...和相应地,调用some(params...)将失败。这种行为可以在这个小代码示例中演示:

我可以防止这种行为吗?我可以强制编译器重新推导参数列表吗?


编辑:

另一个特点是编译器似乎表现得有点精神分裂。当我将内容更改foo

编译器将创建一个将2在此示例中打印的程序。但是,如果我包含注释行(这没有意义,应该触发编译器诊断),我会遇到

那么编译器现在是否同时推断sizeof...(params)为是213?或者他改变主意并选择现在13只是因为我在 lambda 中添加了另一个语句?如果我改为选择static_assert(2 == sizeof...(params));. 所以编译器推断sizeof...(params) == 2,除非我问他是否做了推断2,因为那时他没有。

显然,lambda里面写的是什么,对于参数包推导是非常有决定性的。只是我还是这种行为真的看起来很病态?

0 投票
1 回答
77 浏览

c# - 在 c# 中使用 lambda 或 linkq 查找项目索引

嗨,我不会说英语,如果让你感到困惑,请原谅我。

在 c# 中,我有 3 个字符串列表。

list_one:文件地址列表。

list_two:使用list_one制作的 MD5 列表。

list_three:使用list_two制作的 MD5 列表,但在此列表中,我从list_two收集重复项

问题

如何获取 list_three 中的每个项目并在 list_two 中搜索然后返回该索引。

但我不喜欢使用 for 或 foreach 因为这会减慢我的应用程序。

如何使用 linq 或 lambda 或任何最快的方式来做到这一点。

我的清单图片