此处x
,y
,z
是整数,但在开始时不知道。在运行期间,它将计算x
,y
,z
的值。我想将这些值用作案例条件。
id = 1;
switch(id){
case x:
//call some function
break;
case y:
//call some different function
break;
default:
//error
break;
}
答案 0 :(得分:4)
不,案例标签需要是编译时积分常量。
您需要使用条件语句:
if (id == x) {
// ...
} else if (id == y) {
// ...
} else if (id == z) {
// ...
} else {
// "default case"
}
另请注意,x
,y
和z
可能并非全部不同,因此声明的顺序很重要。 (但是如果您通过其中任何一个案例标签,则该顺序对switch
中的案例标签也很重要。)
答案 1 :(得分:0)
正如n.m,Kerrek SB和此SO answer所指出的,案例标签需要是编译时积分常量。
Kerrek SB的答案显示了直接且直观的if - else if
- 级联解决方案。
但是,如果您还希望使用break
语句中的switch
- 功能,那么以下if - if
- 级联作为一般模式将适用:
bool isBreak = false;
if (id==x) {
...
isBreak = true;
}
if (!isBreak && id==y) {
...
}
if (!isBreak) {
...
}
请注意,使用此模式,您可以表达 - 与switch
相反 - 也可以表示多个case
- 语句(表示为if
s)匹配的情况,例如何时x == y
。
答案 2 :(得分:0)
不支持您想要的内容(正如其他答案所指出的那样)。然而,更糟糕的是,它不合理,因此无法以任何方式进行模拟。这是因为case
中的switch
是唯一的,并且它们的顺序无关紧要(除非是落空),所以
switch(enum_object) {
case A: return foo<A>();
case B: return foo<B>();
default: return foo<C>();
}
和
switch(enum_object) {
default: return foo<C>();
case B: return foo<B>();
case A: return foo<A>();
}
给出相同的代码,但
if(id == run_time_value_A)
return foo<A>();
if(id == run_time_value_B)
return foo<B>();
return foo<C>();
与
不一样if(id == run_time_value_B)
return foo<B>();
if(id == run_time_value_A)
return foo<A>();
return foo<C>();
如果run_time_value_B==run_time_value_A
,则会有所不同。