繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM