Raf*_*ini 8 c++ lambda coding-style c++11
我真的很喜欢lambdas并且有能力在C++中使用它是一种乐趣.但是,因为我已经习惯了Haskell,lambdas非常适合语法,我正在努力学习如何在C++中使用它们而不会编写难以理解的混乱长代码行.
所以,举个例子,假设我写这个:
vector<double> foo(10,0.2);
for_each(foo.begin(), foo.end(), [](double x){ std::cout << x << " ";})
Run Code Online (Sandbox Code Playgroud)
这不是那么难读,lambda表达式非常小.但是如果我在for_each中有两个或三个行长函数,这可能会成为我的代码阅读技能的问题:
vector<double> foo(10,0.2);
randomNumberGenerator bar;
for_each(foo.begin(), foo.end(), [](double x){ std::cout << "hello!"; x+=bar()/(1+bar()); std::cout << x << " ";})
//sorry, I couldn't think of a less stupid example...
Run Code Online (Sandbox Code Playgroud)
这条线开始变得烦人的长,难以阅读我的口味......
对于这种情况,您首选的代码约定是什么?我应该写:
for_each(foo.begin(), foo.end(),
[] (double x) {
std::cout << "hello!"
x += bar()/(1+bar());
std::cout << x << " ";
});
Run Code Online (Sandbox Code Playgroud)
或类似的东西?我仍然认为这种语法有点不自然,难以阅读...... :(
我经常去
for_each(foo.begin(), foo.end(), [](double x) {
std::cout << "hello!"
x += bar()/(1+bar());
std::cout << x << " ";
});
Run Code Online (Sandbox Code Playgroud)
我写了几百行lambdas.
如果您愿意,可以单独命名lambda auto
:
auto const baz = [](double x)
{
std::cout << "hello!"
x += bar()/(1+bar());
std::cout << x << " ";
};
std::for_each(foo.begin(), foo.end(), baz);
Run Code Online (Sandbox Code Playgroud)