可以在本地使用lambda吗?

Mar*_*cký 8 c++ lambda function code-cleanup

是否可以将lambda函数定义为仅在本地使用,即在当前块(函数/方法)中?考虑一些代码将要执行多次的情况(因此将它放入函数中是合乎逻辑的)但它永远不会在块之外使用.

void foo() {
    auto bar = []() {
        // some code applicable only inside foo()
    };

    bar();
    bar();
    bar();
}
Run Code Online (Sandbox Code Playgroud)

bar()声明为正常功能相比,这种方法有哪些优点和缺点?

Bat*_*eba 15

如果可以选择这样做,那么是,将lambda本地化bar为特定函数.

在C++中,我们总是尽量将对象保持为本地对象.(使代码更容易理解,简化文档,便于重构,&c.&c ..)

  • 现在这就是我所说的"基于意见的答案"......"尽可能将对象保持为本地"并不意味着尽可能地实现类和函数.其他陈述也相当有争议,例如我不会调用堆栈充满lambda调用乱码"更容易遵循". (3认同)
  • 在dimm的答案中有一些有趣的想法...我认为这是避免代码重复的一个很好的选择,如果bar无论如何都与foo紧密耦合(甚至可能在闭包中有一些局部变量).如果bar*可以*独立使用(即使它不是),我更喜欢单独的功能( - >可重用性). (3认同)
  • 当我本地化一个函数时,我说"我保留更改该函数的权利,而无需重新编译和重新测试整个该死的项目".为此,我不同意"它可以*可以重复使用"的理想主义. (3认同)

Ric*_*ges 10

我同意这是一个好习惯.高级逻辑几乎总是比低级逻辑更容易阅读.我经常以这种方式编写函数:

void foo()
{
  // introduce actors here
  auto something = make_something();

  // introduce detailed definitions
  auto bing = [&]()->bool { ... };  // define what binging means

  auto bong = [&]() { ... };  // define what bonging means

  // perform logic
  while (bing())
    bong();
}
Run Code Online (Sandbox Code Playgroud)

请记住,从c ++ 17开始,lambda constexpr默认为.gcc et.人.经常完全优化它们.这些都不是性能考虑因素.


dim*_*imm 5

你能行的.主要问题是它会更具可读性吗?把它放在外面可以减少压痕.

你应该问的问题:

  1. 酒吧功能短吗?
  2. 它是纯粹的功能,还是修改了什么?
  3. 它与foo紧密相关,还是可以在其他地方重复使用?
  4. 你想要另一级别的缩进吗?


Max*_*hof 5

从正确/标准的角度来看,这当然是可以的.除此之外,这个问题主要是基于意见的.

Lambdas是C++中的众多工具之一.他们在"复制粘贴以便重复使用"(代码嗅觉)和"将其提取到函数中"之间添加了另一层结构.我个人非常喜欢函数本地lambda用于完全列出的目的:您正在重用一小段仅在此函数范围内有意义的代码.

有人认为它应该仍然是它自己的功能(因为你的所有功能都是5行或更短,对吧?好吧,我怀疑它......).特别是,如果你想重用那个lambda代码,它肯定应该是它自己的函数.但在此之前,这是值得考虑具有该代码的好处就在那里旁边用在哪里,而不是一个屏幕或多个滚动而去.此外,两种方法都给操作命名,但lambda需要较少的开销(例如私有成员函数膨胀).在同一页面上,向标题添加私有成员函数会触发重新编译,而在其中添加lambda .cpp则不会.

最后,考虑什么会使代码最具可读性.如果使用lambda或将其提取到函数之间的代码清晰度差异很小(不太可能),则编写代码的便利性开始变得重要,为此上述考虑因素发挥作用.

至于测试,它取决于你想要测试的细粒度.lambda表达式是否return a && b && (a == b);真的需要测试?如果它只是内联使用(即没有提取为lambda或函数),你会测试它吗?在某些时候它会浪费时间,但在SO答案中确定这一点是不可能的.