[英]Switch to execute same function for all cases along with single print statement for one of them
[英]Execute all cases in switch statement - specific issue
如何在switch语句中执行所有情况而又不重复大型“多合一”情况下的现有情况?
例如
switch(obj.nObjType)
{
case eElephant:
...
break;
case eFoo:
...
break;
case eSeptember:
...
break;
default:
return;
}
我想强制所有三种情况( eElephant, eFoo, eSeptember
)执行代码,就像没有break;
,例如在nObjType = eAllTypes
情况下。
您不能只是忽略休息。 而是重组代码。
switch(obj.nObjType) {
case eElephant:
pokeElephant();
break;
case eFoo:
barTheFoo();
break;
case eSeptember:
rememberSeptember();
break;
case eAllTypes:
pokeElephant();
barTheFoo();
rememberSeptember();
break;
default:
return;
}
然后使用if
语句:
if (obj.nObjType == eElephant || obj.nObjType == eAllTypes)
{
// Elephant code
}
if (obj.nObjType == eFoo || obj.nObjType == eAllTypes)
{
// Foo code
}
// etc.
这个答案就是应该怎么做。 然而:
我看到,不生成大量代码行就很难找到正确的解决方案。 感谢@TobiMcNamobi,但是在我的开关中,大约有200种情况,因此为每种情况创建一个函数不是一个好主意。 我认为,最好的办法是(不幸地)在一个大案件中复制所有案件。 因为,我想,如果其他方法效率低得多,那么switch语句呢?
在这么多情况下(您到底在做什么?),即使提取方法也会在switch语句的主体中留下200个额外的函数调用。 这可能会变得难以快速维护。
在这种情况下,我将执行以下操作:
switch(enum_variable)
{
case e_all:
case e_1:
e_1_function();
if(enum_variable != e_all){break;} //**
case e_2:
e_2_function();
if(enum_variable != e_all){break;} //**
//...
default:
break;
}
并非所有情况下,标记为//**
的行都会中断。 它实现起来很快(可以通过搜索和替换break;
来完成break;
这可以加快您的工作速度),并且可以满足您的需求。
话虽如此,这仍然是一个非常糟糕的方法,但是有时必须要有例外。
但是,我建议您不要将此作为将来使用的样式。 您可能会发现,通过重新考虑项目的工作流程可以做得更好,因为这可能使您得以简化和改进。 当然,我们不知道您在做什么,所以我无法提供更多建议。
如果将switch语句放在函数中,并使obj
具有标志列表而不是标志,则可以使用switch语句为列表中的每个标志调用该函数。 伪:
void dostuff(flag)
switch(flag) {
// ...
}
}
for (auto flag in obj.flags) {
dostuff(flag)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.