C++ 如何将switch中的case条件用作c++;?
这里的C++ 如何将switch中的case条件用作c++;?,c++,c++11,C++,C++11,这里的x,y,z是整数,但它们在开始时是未知的。在运行期间,它将计算x,y,z的值。我想使用这些值作为case条件 有没有办法在开关中使用这些值 如果使用if-else循环,则不使用switch,ho 否,案例标签需要是编译时整数常量 您将需要改用条件语句: if (id == x) { // ... } else if (id == y) { // ... } else if (id == z) { // ... } else { // "default case" } 还
x
,y
,z
是整数,但它们在开始时是未知的。在运行期间,它将计算x
,y
,z
的值。我想使用这些值作为case条件
否,案例标签需要是编译时整数常量 您将需要改用条件语句:
if (id == x) {
// ...
} else if (id == y) {
// ...
} else if (id == z) {
// ...
} else {
// "default case"
}
还要考虑到
x
、y
和z
可能并不都是不同的,因此语句的顺序很重要。(但如果您遇到任何一个问题,则顺序对开关中的大小写标签也很重要。)正如n.m,Kerrek SB所指出的那样,大小写标签需要是编译时积分常数。
Kerrek SB的答案显示了直接直观的if-else if
-级联解决方案。
但是,如果您还想使用switch
-语句中的break
-功能,则以下if-if
-级联为通用模式将适用:
bool isBreak = false;
if (id==x) {
...
isBreak = true;
}
if (!isBreak && id==y) {
...
}
if (!isBreak) {
...
}
注意,与switch
相反,使用此模式,您可以表示多个case
-语句(表示为if
s)匹配的情况,例如,当x==y
不支持您想要的内容时(如其他答案所指出)。然而,更糟糕的是,它是不明智的,因此不能以任何方式模仿。这是因为开关
中的案例
s是唯一的,并且它们的顺序不重要(除非是在失败的情况下),因此
开关(枚举对象){
案例A:返回foo();
案例B:返回foo();
默认值:返回foo();
}
及
开关(枚举对象){
默认值:返回foo();
案例B:返回foo();
案例A:返回foo();
}
给出相同的代码,但是
if(id == run_time_value_A)
return foo<A>();
if(id == run_time_value_B)
return foo<B>();
return foo<C>();
if(id==运行时间值)
返回foo();
if(id==运行时间值)
返回foo();
返回foo();
和,比方说,
if(id == run_time_value_B)
return foo<B>();
if(id == run_time_value_A)
return foo<A>();
return foo<C>();
if(id==运行时间值)
返回foo();
if(id==运行时间值)
返回foo();
返回foo();
如果run\u-time\u-value\u-B==run\u-time\u-value\u-A
我不理解你的最后一句话,因为案例标签必须是不同的?@alain:是的,但它们的顺序很重要,这是我试图表达的观点(很糟糕)。在我的情况下,顺序并不重要。我可以把案例1写在第二位。另外,我尝试的是10个案例。根据输入,其中将使用一定数量的案例,例如5个案例。这些箱子标签将相应设置。其余的将不使用,并且不会被调用,因为开关值不会调用这些情况。
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>();