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