2016-07-26 5 views
0

forループでは、continueを呼び出して現在の繰り返しを中断することができます。同様に、Concurrency::parallel_forループでは、ラムダ関数を呼び出すスレッドである現在の反復をreturnで中断できます。ループのための連続的および並列的にループを続けるための共通キーワード

時から、私が、parallel_forループをデバッグすることが、順次作成し、void機能では、コンパイラは文句を言わないので、continuereturnを変更することを忘れなければならないことが起こります。これは時々追跡するのが難しいエラーにつながります。

両方のループで同じキーワード/マクロ/ ...を使用するメカニズムがVisual C++ 2013に用意されているのだろうか。これは可能ですか?

+0

あなたはもちろん、それを行う方法については、独自の –

+0

マクロどんな提案を定義することができますか?現在のスコープ、つまりforまたはparallel_forに依存する必要がありますか? – mOfl

+0

それは醜いが、可能です... 'の#define EXIT_CURRENT_LOOP_ITERATION continue' 'の#define EXIT_CURRENT_LOOP_ITERATION return' あなたがねえ、私は最初の提案が実際に動作することを認識していなかった –

答えて

1

だけデバッグ用シーケンシャルループを使用しているので、あなたもラムダを使用するバージョンに変身できます

parallel_for (first, last, [&](size_t i) 
{ 
    if(condition) 
     return; 
    do_stuff(i); 
}); 

は、それは確か、醜い

for (size_t i = first; i < last; i++)[&] 
{ 
    if(condition) 
     return; 
    do_stuff(i); 
}(); 

に変換します。しかし、それがデバッグのためだけ存在するならば、それはそのままにはならないでしょう。


それとも、あなたは1回の反復を行うループ内のすべてのあなたのラムダ関数をラップし、常にcontinueの代わりreturnを使用することができます。欠点は、非デバッグコードを醜くすることです。

parallel_for (first, last, [&](size_t i) 
{ 
    do { 
     if(condition) 
      continue; // same as return 
     do_stuff(i); 
    } while(0); 
}); 

シーケンシャル形式で同じ作品:

for (size_t i = first; i < last; i++) 
{ 
    do { 
     if(condition) 
      continue; // same as continue without the do/while 
     do_stuff(i); 
    } while(0); 
} 
+0

必要がある1つを定義します。はい、少し醜いですが、それはデバッグのためのものなので、私はこれを私の問題の解決策として受け入れます。 – mOfl

関連する問題