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

时间:2014-09-30 08:11:51

标签: c++

如何在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的情况下。

4 个答案:

答案 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)
}