我在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语句。
答案 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 ++中直接实现,但可以为您提供一个思路。通过使用多态,将来您的代码将更具可读性并易于扩展。