这是lambda表达式的有效(ab)使用吗?

Xeo*_*Xeo 13 c++ lambda break nested-loops c++11

就像我们都知道的那样,break从外部循环中嵌套循环并不容易,没有:

虽然,你必须承认,所有这些都有点笨拙.特别是函数版本缺少,因为缺少调用循环的上下文,因为您需要将循环中所需的所有内容作为参数传递.
另外,第二个对于每个嵌套循环都会变得更糟.
所以,我个人仍然认为该goto版本是最干净的.


现在,考虑所有C++ 0x和东西,第三个选项带给我这个想法利用lambda表达式:

#include <iostream>

bool CheckCondition(){
  return true;
}

bool CheckOtherCondition(){
  return false;
}

int main(){
  [&]{while(CheckCondition()){
    for(;;){
      if(!CheckOtherCondition())
        return;
      // do stuff...
    }
    // do stuff...
  }}();
  std::cout << "yep, broke out of it\n";
}
Run Code Online (Sandbox Code Playgroud)

(Ideone的例子.)

这允许return第三种选择提供的简单的语义美,同时不会遇到上下文问题并且(几乎)像goto版本一样干净.它比任何上述选项都更短(以字符为单位).


现在,我已经学会了在找到语言的美妙(ab)使用后保持喜悦,因为几乎总有一些缺点.这个有什么吗?或者甚至有更好的方法来解决这个问题?

Joh*_*itb 16

请不要在我管理的项目中这样做.在我看来,这是对lambdas的尴尬滥用.

使用goto其中一个goto是有用的.

  • 我完全同意.1)明确,2)"惯用",3)在C++幼儿园教授作为C++中唯一正确使用"邪恶`goto`" (2认同)

Ben*_*ley 5

我认为完全正确。虽然我更喜欢为我的代码分配名称,使代码更加自我记录,即

int main(){

  auto DoThatOneThing = [&]{while(CheckCondition()){
    for(;;){
      if(!CheckOtherCondition())
        return;
      // do stuff...
    }
    // do stuff...
  }};

  DoThatOneThing();
  std::cout << "yep, broke out of it\n";
}
Run Code Online (Sandbox Code Playgroud)

  • 既然你已经命名了这个东西,那么这样做有什么好处(除了你知道如何做很酷的 lambda 东西),而不是使用普通的函数?我不喜欢这个。 (4认同)
  • @Xeo:你严重低估了名字。名称在编程中非常重要且非常强大。有时我对函数名称的思考时间比对其函数体的思考时间更长,我希望更多的程序员会这样做。 (4认同)
  • @Xeo,@sbi:因为它是本地的,并且不会污染命名空间。 (2认同)
  • @sbi:名字,就像评论一样,可能具有欺骗性;代码是不言自明的。你严重高估了名字。 (2认同)
  • @ildjam:代码准确地说明了它的作用,而不是更适合名称(和注释)的摘要(或程序员的意图)。如果您习惯在代码中对自己撒谎,我强烈建议您_停止这种行为_。重构以引入合理的名称非常容易...... (2认同)