如何解决这是lambda表达式的有效滥用用法吗?
| 众所周知,要从嵌套循环中将“ 0”从外循环中移出却没有一个都不容易: agoto
(示例代码。)
外循环中的另一种条件检查(示例代码。)
将两个循环都放在一个额外的函数中并返回,而不是返回“ 0”(示例代码。)
但是,您必须承认,所有这些都有些笨拙。尤其是缺少函数版本,因为缺少调用循环的上下文,因为您需要将循环中需要的所有内容作为参数传递。
此外,对于每个嵌套循环,第二个循环变得更糟。
因此,我个人仍然认为goto
版本是最干净的版本。
现在,考虑所有C ++ 0x和其他内容,第三个选择使我有了使用lambda表达式的想法:
#include <iostream>
bool CheckCondition(){
return true;
}
bool CheckOtherCondition(){
return false;
}
int main(){
[&]{while(CheckCondition()){
for(;;){
if(!CheckOtherCondition())
return;
// do stuff...
}
// do stuff...
}}();
std::cout << \"yep,broke out of it\\n\";
}
(例如在Ideone的示例。)
这使得第三个选项提供的简单ѭ5的语义美感同时又不遭受上下文问题的困扰,并且(几乎)与goto
版本一样干净。它甚至比上述任何选项都更短(按字符)。
现在,在发现语言的优美用法之后,我学会了保持喜悦,因为几乎总是存在某种弊端。有这个吗?还是有解决这个问题的更好方法?
解决方法
请不要在我管理的项目中这样做。我认为这是对lambda的尴尬滥用。
使用
goto
时,请使用goto
。
,我认为完全有效。虽然我更愿意为我的名字分配名称,但使代码更具自我记录性,即
int main(){
auto DoThatOneThing = [&]{while(CheckCondition()){
for(;;){
if(!CheckOtherCondition())
return;
// do stuff...
}
// do stuff...
}};
DoThatOneThing();
std::cout << \"yep,broke out of it\\n\";
}
,通过哪种方式对
void frgleTheBrgls()
{
while(CheckCondition()) {
for(;;) {
if(!CheckOtherCondition())
return;
// do stuff...
}
// do stuff...
}
}
int main()
{
frgleTheBrgls();
std::cout << \"yep,broke out of it\\n\";
}
这是众所周知的(函数,就像在BASIC中一样),更清晰(算法的名字很好地解释了它的作用),并且其作用与您的完全相同。
尤其是缺少函数版本,因为缺少调用循环的上下文,因为您需要将循环中需要的所有内容作为参数传递。
我认为这是一个优势。您确切地看到了使小碎片变皱所需的东西。编程时,明确性通常是一件好事。
,建议的语法有一个缺点:嵌套循环不能超过2个。 \'goto \'语法允许这样做:
int main()
{
for (;;)
{
for (;;)
{
for (;;)
{
if (CheckCondition1()) goto BREAK_ON_COND1;
if (CheckCondition2()) goto BREAK_ON_COND2;
if (CheckCondition3()) break;
// Do stuff when all conditions are false
}
// Do stuff when condition 3 becomes true
}
BREAK_ON_COND2:
// Do stuff when condition 2 becomes true
}
BREAK_ON_COND1: // When condition 1 becomes true
std::cout << \"yep,broke out of it\\n\";
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。