Как мы все знаем, это не так просто break
из вложенного цикла из внешнего цикла без:
- a
goto
( Пример кода. ) - другая проверка состояния во внешнем цикле ( Пример кода. )
- , помещая оба цикла в дополнительную функцию и возвращая вместо
break
ing (* 1015)* Пример кода. )
Хотя, ты должен признать, что все это довольно неуклюже.В частности, отсутствует версия функции из-за отсутствия контекста, в котором вызываются циклы, так как вам нужно передать все необходимое в циклах в качестве параметров.
Кроме того, второй ухудшается для каждого вложенного цикла.
Итак, я лично все еще считаю версию goto
самой чистой.
Теперь, думая обо всем C ++ 0x и прочем, третий вариант принес мне эту идею, используя лямбда-выражения:
#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";
}
( Пример в Ideone. )
Это обеспечивает семантическую красоту простого return
, который предлагает третий вариант, не страдая от проблем контекста ибудучи (почти) столь же чистым как версия goto
.Это также даже короче (по характеру), чем любой из вышеперечисленных вариантов.
Теперь я научился сдерживать свою радость после нахождения прекрасного (ab) использования языка, потому что есть почтивсегда какой-то недостаток.Есть ли на этом?Или есть даже лучший подход к проблеме?