2016-07-26 73 views
0

在順序for循環中,可通過調用continue來中斷當前迭代。同樣,在Concurrency::parallel_for循環中,當前迭代 - 這是調用lambda函數的線程 - 可以用return中斷。在順序循環和並行循環中'繼續'的通用關鍵字

不時,它發生,我有調試parallel_for循環,使其連續而忘記了return變成一個continue,因爲在void函數,編譯器不會抱怨。這導致有時很難追查的錯誤。

我不知道是否Visual C++ 2013提供了任何機制來使用相同的關鍵字/宏/ ...兩個循環。這可能嗎?

+0

你當然可以定義如何做自己的宏 –

+0

什麼建議嗎?它將不得不依賴於當前的範圍,即for或parallel_for,對嗎? – mOfl

+0

這是醜陋的,但有可能... '#定義EXIT_CURRENT_LOOP_ITERATION continue' '#定義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); 
}(); 

這是醜陋的,肯定的。但是,如果僅僅用於調試,它不會保持這種狀態。


或者,你可以包裝在一個循環中,做了一次迭代所有的lambda函數,並始終使用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

嘿,我不知道,第一個建議實際工作的人。是的,這有點難看,但是因爲它只是用於調試,所以我會接受這個作爲我的問題的解決方案。 – mOfl