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

c++ - 为什么 C++20 模板 lambda 使用 typename 关键字?

我理解一致性参数,但是模板的大多数参数都是类型,所以我觉得由于 lambdas 是定义结构的简洁方式,它可能应该默认为typename/ class(你仍然需要编写int/size_t/short)。

如果有人不熟悉 C++20 中对 lambdas 的更改,这里是示例:

我的问题是为什么不:

0 投票
1 回答
104 浏览

c++ - Clang 声称通用 lambda 参数的 constexpr 成员不是 constexpr

我想写一个通用的 lambda 作为一个变体的访问者。这个变体的成员包含一个 constexpr 成员值,我想在访问者中使用它。例如:

GCC 很高兴从7.1 版开始编译此代码。另一方面,Clang 抱怨arg.this_r == 0参数if constexpr不是恒定的,回到版本 4.0.0但这仍然存在于当前的 trunk中。

谁在这里正确,我该如何避免这个问题(假设一个简单if的不会削减它,因为两个分支之一是不可实例化的)?

附录:arg作为值而不是 const 左值引用传递,Clang很高兴,但不幸的是,这不是我的选择。

0 投票
4 回答
299 浏览

c++ - 是否可以将通用 lambda 作为非模板参数传递

我有一个玩具示例,我想在架构上进行修改以删除 on 的类型Processor依赖EmitterT

动机

我想将负责利用处理结果的部分与处理本身分离。类Emitter结构给了我,所以我必须支持重载函数。

我想将 lambda 函数传递给将使用它的处理器。有点像回调机制,但它必须是通用的 lambda,才能支持重载。

我试过的:

我编写的示例有效,但它取决于Emitter作为模板参数的类型。我不喜欢Processor基于Emitter. 它也具有传染性,我有一个真正的Processor等级制度,并且Emitter传播得差不多const或更糟。

阅读https://stackoverflow.com/a/17233649/1133179后,我尝试使用以下结构作为成员:

但是当将其用作普通参数时,我无法找到一种推迟执行Emitterafter的方法。Processor它使用前向声明和引用来解决,EmitterC&但它只支持一个发射器定义。我能想出的唯一方法是删除 lambda,并EmitterC为我期望的每种类型进行虚拟重载Emitter并将其用作基类。

那么,有没有办法将(通用)lambda 作为参数传递,以便该Processor类型不依赖于Emitter

我仅限于 c++14,但如果有更好的支持,我也对更现代的标准感兴趣。

0 投票
3 回答
258 浏览

c++ - 为什么在爆炸 std::tuple 时需要 std::integral_constant?

问题1>为什么我必须在下面的语句中使用std::integral_constant<std::size_t, Idx>{}而不是简单的?Idx根据我的理解,std::integral_constant<std::size_t, Idx>是一种类型。std::integral_constant<std::size_t, Idx>{}的值是真的Idx吗?

// 好的

// 错误

std::get预期的编译时常量表达式 whileIdx不是编译时常量表达式是真的吗?

问题2>为什么我们不能通过std::index_sequence引用传递?

// 错误: auto make_index_dispatcher(std::index_sequence<Idx...>&)

谢谢

0 投票
1 回答
64 浏览

c++ - 理解嵌套的 lambda 表达式

我的问题与以下嵌套 lambda 表达式有关,作为Lambda 表达式下的示例提供

以下是我对上述表达式的解释方式:

在表达式中

闭包对象由其类型对应于 lambda 表达式vglambda的闭包对象初始化printer

在内部printer,嵌套的(匿名)lambda 表达式

printer通过复制捕获并将其参数包作为rvalue参考。

在(匿名)lambda 表达式的主体内,表达式

将参数包转发到printer[在本质上似乎是printerusing的调用operator ()]

在(匿名)lambda 表达式主体内的最后一个表达式中,(匿名)空值 lambda 表达式似乎printer通过复制从封闭范围捕获闭包对象以及参数包,并printer使用其转发参数调用闭包对象盒。

现在,很明显我在这里没有得到任何东西。本质上,为什么在(匿名)lambda 表达式的主体中提供了两条不同的调用printer闭包对象的行,一条没有(匿名)空值 lambda 表达式,另一条在里面?

任何专家都可以提出更多的观点吗?

0 投票
2 回答
204 浏览

c++ - lambda 表达式的惰性实例化

我想foo::func()在 lambda 表达式中访问,但此时foo已声明该类但未定义该类。有什么办法可以懒惰地进行 lambda 表达式吗?

如果我用等效的函数对象替换 lambda 表达式,那么我可以做到这一点。

这是等效的代码:

单独的声明和定义方法

运行演示:https ://wandbox.org/permlink/12xV6655DZXZxLqF

它可以在 g++ 和 clang++ 上编译。

我的目标是 Lambda 表达式方法

我试图消除struct lambda

这是代码:

关键是显式地编写返回类型void。如果我省略了这一点,那么 g++ 和 clang++ 的编译器都会在f.func();. 如果我添加void返回类型,似乎 g++ 会懒惰地实例化 lambda 表达式的主体。但是 clang++ 仍然输出相同的错误。

结果:

哪个编译器有效?

如果 clang++ 是有效的,有没有办法像等效的一样懒惰地实例化 lambda 表达式的主体struct lambda

具有成员函数模板方法的函数对象

我注意到分离声明和定义方法并不真正等同于Lambda 表达式方法。lambda 表达式auto&的参数是lambda::operation(),但分离声明和定义方法的参数是foo&

应该是模板。这是等效的代码:

运行演示:https ://wandbox.org/permlink/dJ1tqQE8dIMNZqgY

它不需要单独声明lambda::operator(). 并在 g++ 和 clang++ 上懒惰地实例化它。如果可能的话,我正在寻找一种使用 lambda 表达式的方法。

背景(我为什么需要这个?)

我正在使用基于元编程的状态机库 Boost (Candidate) SML。

https://github.com/boost-experimental/sml/issues/93#issuecomment-283630876

  • struct with_prop对应于struct foo
  • struct table对应于struct bar
  • 外部 lambda 表达式[](with_prop& p) {...对应于void bar::memfun(foo& f).
    • 由于 SML 重载解析,参数foo& f不能是auto& f.
  • 内部 lambda 表达式[](auto& p) -> void { ...对应于[](auto& f) -> void { ...
  • auto table::operator()() const noexcept不能分开声明和定义,因为 SML 在operator()()定义之前使用返回类型。
0 投票
0 回答
39 浏览

c++ - 关于 C++ 中的 Lambda 函数

我已经使用 C++ 很长时间了,但我最近才开始使用 lambdas。我有以下示例,这给我带来了一些麻烦(为什么会这样)。请记住,这只是一个示例片段。

这些术语Lu_163_Exp.spin1Exp[i]是位于另一个类中的一些常量双向量,我想从多个.cpp源访问它,并且band1EnergyShifted()是在TwoParams类中声明的方法。这种方法也是双重类型的。

现在,我的问题是:如果rmslambda 有参数expthdouble 类型,编译成功,但如果我有

编译给出错误:

据我到目前为止所了解的,编译器应该自己弄清楚参数的类型exp以及th参数是否为自动类型。我错过了什么吗?

先感谢您!

0 投票
1 回答
192 浏览

c++ - 通用 lambda 和一元 + 运算符

据我了解,+lambda 表达式之前的运算符将其解析为函数指针重载。(帖子

但是我不太明白为什么它不适用于通用 lambda。例如:

这背后的直觉是什么?

活生生的例子

0 投票
2 回答
389 浏览

c++ - 如何推断 lambda 的返回类型?

我想map()在 C++ 中模仿 Ruby 的方法。我正在努力自动找出返回类型:

这样它可以编译,但T2固定为string. 如果我使用其他T2定义,编译器会抱怨couldn't deduce template parameter 'T2'。我也尝试使用std::declval,但可能不是正确的方法 - 我无法解决问题。

0 投票
1 回答
101 浏览

c++ - 如何修改 Lambda 表达式以将输出放入文本文件?

我有一个代码,我可以用它在屏幕上显示输出。但是,我想把输出放在一个文本文件中。坦率地说,我读过 Lambda 表达式,但我很难理解它的功能(因为我是初学者)。

我可以要求帮助我吗?我想要一个输出文本文件,就像输出在屏幕上写的那样。看来最重要的事情是关于我放“ secondoutput << value << " ";”和“ secondoutput << "\n" ;”的地方。

我不知道他们应该在哪里。我总是将“ secondoutput << value << " ";”放在其​​他代码中,它们运行良好,并给我一个输出文本文件。但是现在,我不知道为什么它们不起作用。提前感谢您的帮助

问候