C++ の「名前付きループ イディオム」に関する記事を読みました: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Named_Loop
このイディオムを使用すると、次のように書くことができます。
named(outer)
for(int i = 0 ; i < rows ; ++i) {
named(inner)
for(int j = 0 ; j < cols ; ++j) {
if(some_condition)
break(outer); // exit the 'outer' loop
}
}
このような構造は、Java などの多くの言語のコア機能として既に存在します。
記事によると、2 つの悪意のあるマクロを定義することにより、C++ で実装できます。
#define named(blockname) goto blockname; \
blockname##_skip: if (0) \
blockname:
#define break(blockname) goto blockname##_skip;
多くの人が の使用を追放したいと思っていることは知っていますgoto
。break
個人的には、非常にまれなケースで、特にネストされたループが必要な場合に役立つことがわかりました。このイディオムは、そのためのよりクリーンなソリューションのように思えますが、実際のコードで使用しても問題ありませんか?
記事の議論ページでは、以下を読むことができます:
「これはやめろ。地獄に落ちろ」
だから私の質問は次のとおりです。名前付きループイディオムを使用することの欠点は何ですか? それは危険ですか ?はいの場合、なぜですか?
おまけの質問:continue
同様に名前付きを実装することは可能ですか? (構文を使用することはできないと思いnamed(...) for(...;...;...) {}
ますが、誰が知っていますか?)
EDIT:私はあなたに同意します、キーワードを再定義するのは厄介です。#define breakLoop()
代わりに使用するのはどうですか?