如何在switch语句中执行所有情况而不重复大“all-in-one”案例中存在的情况?
例如
switch(obj.nObjType)
{
case eElephant:
...
break;
case eFoo:
...
break;
case eSeptember:
...
break;
default:
return;
}
我希望强制执行所有3个案例(eElephant, eFoo, eSeptember
)的代码,例如没有break;
,例如在nObjType = eAllTypes
的情况下。
答案 0 :(得分:5)
你不能忽视休息。相反,重构你的代码。
switch(obj.nObjType) {
case eElephant:
pokeElephant();
break;
case eFoo:
barTheFoo();
break;
case eSeptember:
rememberSeptember();
break;
case eAllTypes:
pokeElephant();
barTheFoo();
rememberSeptember();
break;
default:
return;
}
答案 1 :(得分:3)
然后使用if
语句:
if (obj.nObjType == eElephant || obj.nObjType == eAllTypes)
{
// Elephant code
}
if (obj.nObjType == eFoo || obj.nObjType == eAllTypes)
{
// Foo code
}
// etc.
答案 2 :(得分:2)
This answer是应该怎么做的。 但是:
我可以看到,很难找到正确的解决方案而不会产生很多 代码行。谢谢@TobiMcNamobi,但在我的转换中有关于 200个案例,因此为每个案例创建一个函数并不是一个好主意。 我认为,最好的(不幸的是)可以复制所有案例 大的一个。因为,我认为,如果其他方面效率低得多 切换声明?
有这么多情况(你到底在做什么?)甚至提取方法都会在switch语句的主体中留下200个额外的函数调用。这可能很难维持得很快。
在 this 的情况下,我会执行以下操作:
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;
来加快速度),并做到你想要的。
话虽如此,它仍然是一种非常可怕的方式,但有时必须做出例外。
但我建议您不将此作为将来使用的样式。您可能会发现通过重新考虑项目的工作流程可以做得更好,因为这可能会让您简化和改进。当然,我们不知道你在做什么,所以我无法提供更多建议。
答案 3 :(得分:1)
如果将switch语句放在函数中,并使obj
有一个列表的标志而不是标志,则可以使用每个标志的switch语句调用该函数在列表中。伪:
void dostuff(flag)
switch(flag) {
// ...
}
}
for (auto flag in obj.flags) {
dostuff(flag)
}