Sté*_*ane 13 c++ lambda c++11 c++14
我继承的类中的构造函数需要传入一个非平凡的对象.类似于:
MyFoo::MyFoo() : SomeBase( complexstuff )
{
return;
}
Run Code Online (Sandbox Code Playgroud)
这complexstuff与之无关MyFoo,所以我不想传递它.
而不是写一些返回的1-off临时函数complexstuff我使用了lambda.我花了几分钟才弄明白的是我必须调用 lambda.所以我的代码现在看起来像这样:
MyFoo::MyFoo() : SomeBase(
[]()
{
/* blah blah do stuff with complexstuff */
return complexstuff;
} () )
{
return;
}
Run Code Online (Sandbox Code Playgroud)
如果你没有抓住它,它是微妙的.但是在lambda体之后,我不得不()告诉编译器立即"运行"lambda.在弄清楚我做错了什么之后才有意义.否则,如果没有()调用lambda,gcc会说类似于:
error: no matching function for call to 'SomeBase(<lambda()>)'
Run Code Online (Sandbox Code Playgroud)
但现在我有想法 - 我这样做了吗?在C++ 11或C++ 14中是否有更好的方法告诉编译器我希望它立即调用我编写的lambda?或者()像我通常的做法那样追加空洞?
Rak*_*111 14
但现在我有想法 - 我这样做了吗?
是的,你做到了.
在C++ 11或C++ 14中是否有更好的方法告诉编译器我希望它立即调用我编写的lambda?
从来没听说过.lambda也只是一个函数对象,所以你需要有一个()调用它,没有办法解决它(当然除了一些调用lambda的函数std::invoke).
如果你想要你可以删除()捕获列表之后,因为你的lambda不带任何参数.
或者
()像我通常的做法那样追加空洞?
是的,这是最短的路.如前所述,std::invoke也可以工作,但它需要更多的打字.我会说直接打电话()是通常的做法.
在 C++17 中,您可以使用std::invoke. 这与您所做的完全相同,但也许您会发现这更清楚。
#include <iostream>
#include <functional>
void foo(int i)
{
std::cout << i << '\n';
}
int main()
{
foo( std::invoke( []() { return 1; } ) );
}
Run Code Online (Sandbox Code Playgroud)
没有办法告诉编译器立即调用 lambda。最简单的课程(在复杂性和键入字符数方面)是您已经完成的课程。对于任何使用过闭包语言的人来说,这也是非常惯用的(我在这里考虑的是 JavaScript)。
如果您想避免使用该语法,请修改SomeBase或complexstuff执行可调用对象。
如果你想要的只是调用 lambda 的语法糖,你总是可以像 Alexandrescu 的 SCOPE_GUARD 那样做,并滥用运算符重载:
#include <iostream>
namespace detail {
enum class invoke_t{};
template<class Callable>
auto operator+(invoke_t, Callable c) -> decltype(c()) {
return c();
}
}
constexpr detail::invoke_t invoke{};
int main() {
invoke + []() {
std::cout << "called";
};
}
Run Code Online (Sandbox Code Playgroud)
但我不会。发明你自己的 DSL 只会让你的代码更难维护。坚持使用简单语言结构的习语。
| 归档时间: |
|
| 查看次数: |
5910 次 |
| 最近记录: |