有没有办法缩短长的switch()语句?

时间:2019-09-21 18:56:05

标签: c++ loops switch-statement

我在switch()语句中处理了很多情况,并且想知道是否有任何可能的方式可以缩短这些情况。它们在我的代码中占用了很多空间,并且当这些语句有3-4个大块时,很难导航。 这是一个示例:

...important lines of code...

void foo(string bar, bool blam) {

     int v1 = stoi(bar);

     switch (v1) {
         case(11):
             if(blam) {
                exArr[1] = "A";
             } else {
                exArr[1] = "B";
             }
             break;

         case(12):
             if(blam) {
                 exArr[3] = "A";
             } else {
                 exArr[3] = "B";
             }
             break;

         ...many more cases...

         default:
             printElement();
             break;
}
...even more important code, which is dependent on the hard code above and hard to navigate...

我认为您看到了问题。你们有什么建议吗?预先感谢。

重要编辑:

仅前12个迭代会更改exArr的字符。之后,它将更改为另一个(现有的)数组,例如ndArr,需要另外12次迭代。这种情况适用于4个数组,因此大约有48个case语句。

4 个答案:

答案 0 :(得分:4)

首先,您可以删除.then语句上的花括号,因为它们是衬纸,位于这样的大小写框内

if else

,您可以更进一步,并使用看起来像这样的Tenary运算符

...
case(12):
    if(blam)
        exArr[3] = "A";
    else
        exArr[3] = "B";
    break;
...

答案 1 :(得分:4)

正如@Alexander Zhang提到的那样,如果您有可以使用的特定算法,则最简单的解决方案将类似于@Ton van den Heuvel提出的解决方案。

如果没有,如果您具有匹配的特定值,则还可以使用查找表(从here引用)。

例如。

#include <map>

.../

map<int,int> mapV1toIndex = {
    {11, 1}, 
    {12, 3},
    .../
};

void foo(string bar, bool blam) {
    int v1 = stoi(bar);
    exArr[mapV1toIndex[v1]] = (blam) ?  "A" : "B";
}

此外,如果您想每次使用不同的字符串数组,则可以将字符串数组传递给foo,这样就可以重用foo函数:

void foo(string *pStrArray, string bar, bool blam) {
    int v1 = stoi(bar);
    pStrArray[mapV1toIndex[v1]] = (blam) ?  "A" : "B";
}

编辑:最好使用std :: map而不是struct。根据{{​​3}}参考,编辑了使用地图的代码。

答案 2 :(得分:2)

假设v1与后续情况之间的关系以相同的方式继续存在,则无需进行切换:

const int v1{stoi(bar)};
if (11 <= v1 && v1 <= ...)
  exArr[1 + (v1 - 11) * 2] = blam ? "A" : "B";
else
  printElement();

答案 3 :(得分:0)

理想情况下,您应该尝试使用多态来解决此问题。我在stackoverflow Ways to eliminate switch in code上找到了这个。 该示例未在C ++中直接实现,但可以为您提供一个思路。通过使用多态,将来您的代码将更具可读性并易于扩展。