问题标签 [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++ - 具有抽象父级的模板类的c ++通用lambda
我有以下情况:
我需要将它们存储起来,std::vector
所以我引入了一个抽象父类,如下所示:
并Derived
继承自Base
:
所以现在我可以std::vector
像这样存储它们:
现在在程序执行的某个时刻,我需要迭代m_Bases
并根据某些条件选择一些并使用它们各自的m_Data
,如下所示:
由于我不能这样做,因为T m_Data
is member of Derived
and 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 与捕获列表一起使用。
所以你可以看到这个解决方案根本不理想,它只是一个想法。
希望有人能想到更好的方法或指导我做其他事情。
java-8 - 带有 RadixSort、BucketSort、Java 8 的比较器接口
我有一个 Java 8 中的 SomeClass 列表,我想对列表进行排序。
举这个例子
名单
相反的顺序
但是,用RadixSort
,订购 120000 怎么样BucketSort
?
(在我看来这是不可能的,但我需要保证安全)是否可以使用 RadixSort、BucketSort 实现 Comparator?
如果是,如何?
java - 从 IntStream,Java 8 返回 LinkedHashMap
我有这个代码。
对于每个time
值 aList<TimePitchValue>
都使用 name 生成listTimePitchValue
,并且我希望将指定的关联listTimePitchValue
与baseTime + time
in 中指定的关联mapListTimePitchValue
。
为了支持
ChunkDTO
班级
TimePitchValue
班级
问题是,是否可以直接Map<Long, List<TimePitchValue>>
从排序返回IntStream
?
(没有先前的 createMap<Long, List<TimePitchValue>> mapListTimePitchValue = new LinkedHashMap<>();
和后来的 put mapListTimePitchValue.put(baseTime + time, listTimePitchValue);
)
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 写入头文件,以便能够在项目中的任何位置使用它,并且我不能以某种方式将声明与定义分开,对吗?
我期待着一个答案!
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 和案例#2 的结果有何不同?
- 为什么尾随返回类型会在案例 #2 和案例 #3 之间产生差异?
您可以在Wandbox上查看。
c++ - lambda 折叠表达式获取索引
有没有一种简单的方法可以将 As 的当前添加到index
包含arg
它的 lambda 调用中,所以我不需要使用index++
c++ - MSVC 构造函数被窃听?
我正在使用最新版本的 MSVC、clang 和 gcc。最后两个接受以下代码,但 MSVC 拒绝它。MSVC 对吗?或者它是一个错误?
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)
为是2
和13
?或者他改变主意并选择现在13
只是因为我在 lambda 中添加了另一个语句?如果我改为选择static_assert(2 == sizeof...(params));
. 所以编译器推断sizeof...(params) == 2
,除非我问他是否做了推断2
,因为那时他没有。
显然,lambda里面写的是什么,对于参数包推导是非常有决定性的。只是我还是这种行为真的看起来很病态?
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 或任何最快的方式来做到这一点。