执行switch语句中的所有情况-特定问题

Execute all cases in switch statement - specific issue

本文关键字:情况 问题 switch 语句 执行      更新时间:2023-10-16

如何在不复制大型"一体式"案例的情况下执行switch语句中的所有案例?

例如

switch(obj.nObjType)
{
case eElephant:
...
break;
case eFoo:
...
break;
case eSeptember:
...
break;
default:
return;
}

我希望强制执行所有3种情况(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;来完成,这为您加快了速度),并且可以随心所欲
话虽如此,这仍然是一种非常糟糕的方式,但有时确实需要例外。

但是,我建议您不要将其作为将来使用的样式。你可能会发现,通过重新思考项目的工作流程,你可以做得更好,因为这可能会让你简化和改进。当然,我们不知道你在做什么,所以我不能提供更多的建议。

如果将switch语句放在函数中,并使obj具有标志列表而不是标志,则可以使用switch语句为列表中的每个标志调用函数。伪:

void dostuff(flag)
    switch(flag) {
        // ...
    }
}
for (auto flag in obj.flags) {
    dostuff(flag)
}