问题标签 [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++20 模板 lambda 使用 typename 关键字?
我理解一致性参数,但是模板的大多数参数都是类型,所以我觉得由于 lambdas 是定义结构的简洁方式,它可能应该默认为typename
/ class
(你仍然需要编写int/size_t/short
)。
如果有人不熟悉 C++20 中对 lambdas 的更改,这里是示例:
我的问题是为什么不:
c++ - 是否可以将通用 lambda 作为非模板参数传递
我有一个玩具示例,我想在架构上进行修改以删除 on 的类型Processor
依赖EmitterT
:
动机
我想将负责利用处理结果的部分与处理本身分离。类Emitter
结构给了我,所以我必须支持重载函数。
我想将 lambda 函数传递给将使用它的处理器。有点像回调机制,但它必须是通用的 lambda,才能支持重载。
我试过的:
我编写的示例有效,但它取决于Emitter
作为模板参数的类型。我不喜欢Processor
基于Emitter
. 它也具有传染性,我有一个真正的Processor
等级制度,并且Emitter
传播得差不多const
或更糟。
阅读https://stackoverflow.com/a/17233649/1133179后,我尝试使用以下结构作为成员:
但是当将其用作普通参数时,我无法找到一种推迟执行Emitter
after的方法。Processor
它使用前向声明和引用来解决,EmitterC&
但它只支持一个发射器定义。我能想出的唯一方法是删除 lambda,并EmitterC
为我期望的每种类型进行虚拟重载Emitter
并将其用作基类。
那么,有没有办法将(通用)lambda 作为参数传递,以便该Processor
类型不依赖于Emitter
?
我仅限于 c++14,但如果有更好的支持,我也对更现代的标准感兴趣。
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...>&)
谢谢
c++ - 理解嵌套的 lambda 表达式
我的问题与以下嵌套 lambda 表达式有关,作为Lambda 表达式下的示例提供
以下是我对上述表达式的解释方式:
在表达式中
闭包对象由其类型对应于 lambda 表达式vglambda
的闭包对象初始化printer
在内部printer
,嵌套的(匿名)lambda 表达式
printer
通过复制捕获并将其参数包作为rvalue
参考。
在(匿名)lambda 表达式的主体内,表达式
将参数包转发到printer
[在本质上似乎是printer
using的调用operator ()
]
在(匿名)lambda 表达式主体内的最后一个表达式中,(匿名)空值 lambda 表达式似乎printer
通过复制从封闭范围捕获闭包对象以及参数包,并printer
使用其转发参数调用闭包对象盒。
现在,很明显我在这里没有得到任何东西。本质上,为什么在(匿名)lambda 表达式的主体中提供了两条不同的调用printer
闭包对象的行,一条没有(匿名)空值 lambda 表达式,另一条在里面?
任何专家都可以提出更多的观点吗?
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++ 仍然输出相同的错误。
结果:
- 在 g++ 9.2.0 上成功
- clang++ 9.0.0 上的错误
哪个编译器有效?
如果 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
.
- 由于 SML 重载解析,参数
- 内部 lambda 表达式
[](auto& p) -> void { ...
对应于[](auto& f) -> void { ...
auto table::operator()() const noexcept
不能分开声明和定义,因为 SML 在operator()()
定义之前使用返回类型。
c++ - 关于 C++ 中的 Lambda 函数
我已经使用 C++ 很长时间了,但我最近才开始使用 lambdas。我有以下示例,这给我带来了一些麻烦(为什么会这样)。请记住,这只是一个示例片段。
这些术语Lu_163_Exp.spin1Exp[i]
是位于另一个类中的一些常量双向量,我想从多个.cpp
源访问它,并且band1EnergyShifted()
是在TwoParams
类中声明的方法。这种方法也是双重类型的。
现在,我的问题是:如果rms
lambda 有参数exp
和th
double 类型,编译成功,但如果我有
编译给出错误:
据我到目前为止所了解的,编译器应该自己弄清楚参数的类型exp
以及th
参数是否为自动类型。我错过了什么吗?
先感谢您!
c++ - 如何推断 lambda 的返回类型?
我想map()
在 C++ 中模仿 Ruby 的方法。我正在努力自动找出返回类型:
这样它可以编译,但T2
固定为string
. 如果我使用其他T2
定义,编译器会抱怨couldn't deduce template parameter 'T2'
。我也尝试使用std::declval
,但可能不是正确的方法 - 我无法解决问题。
c++ - 如何修改 Lambda 表达式以将输出放入文本文件?
我有一个代码,我可以用它在屏幕上显示输出。但是,我想把输出放在一个文本文件中。坦率地说,我读过 Lambda 表达式,但我很难理解它的功能(因为我是初学者)。
我可以要求帮助我吗?我想要一个输出文本文件,就像输出在屏幕上写的那样。看来最重要的事情是关于我放“ secondoutput << value << " ";
”和“ secondoutput << "\n" ;
”的地方。
我不知道他们应该在哪里。我总是将“ secondoutput << value << " ";
”放在其他代码中,它们运行良好,并给我一个输出文本文件。但是现在,我不知道为什么它们不起作用。提前感谢您的帮助
问候