2016-07-26 42 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