C++で多重ループから抜ける時はいつも悩ましいです。
終了フラグを使う、gotoする、関数化するぐらいしか方法がないと思ってました。
しかし、C++11からラムダ式がサポートされ、これを使えば多重ループから抜けられることに気が付きました。(既に使っている人が結構いるような気がしますが、まだ見たことないです。)
C++
1#include <iostream> 2int main() 3{ 4 std::cout << "--- Start ---\n"; 5 [&]{ 6 for (int i=0; i < 5; ++i) { 7 for (int j=0; j < 5; ++j) { 8 std::cout << "[" << i << ", " << j << "]\n"; 9 if ((3 <= i) && (4 <= j)) { 10 std::cout << "end\n"; 11 return; 12 } 13 } 14 } 15 }(); 16 std::cout << "--- End ---\n"; 17}
関数化した方が見通しがよくなる時は関数化するので問題ないのですが、関数化すると見通しが悪くなることがあります。
そのような場合、どれが一番マシと思いますか?
①終了フラグを使う
②gotoを使う
③見通しが悪くなっても関数化する
④ラムダ式を使う
⑤その他(もし、あれば)
実際には、ループを抜けるのにreturn;では意味が異なりすぎて宜しくないので、マクロを使うと思います。
C++
1#include <iostream> 2 3// ラムダ式を使った多重ループbreak 4#define MULTI_BREAK_BEGIN [&] 5#define MULTI_BREAK return; 6#define MULTI_BREAK_END (); 7 8int main() 9{ 10 std::cout << "--- Start ---\n"; 11 MULTI_BREAK_BEGIN 12 { 13 for (int i=0; i < 5; ++i) { 14 for (int j=0; j < 5; ++j) { 15 std::cout << "[" << i << ", " << j << "]\n"; 16 if ((3 <= i) && (4 <= j)) { 17 std::cout << "end\n"; 18 MULTI_BREAK 19 } 20 } 21 } 22 } 23 MULTI_BREAK_END 24 std::cout << "--- End ---\n"; 25}
我ながら「なんだかな~」って感じますが、①②よりはマシな気がするので皆さんのご意見をお聞かせ下さい。
【追記】
皆さん、ご意見、ありがとうございました。
私自身も元々goto派なのでgotoの意見が多くてなんとなく嬉しかったです。
しょっちゅう出てくるようなパターンでもないですしね。
このご意見が私の中で一番響いたので、toki_tdさんの回答をベストアンサーにさせて頂きました。

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/30 13:39