如何在c ++中将switch中的case条件用作变量?

时间:2017-01-16 08:57:31

标签: c++ c++11

此处xyz是整数,但在开始时不知道。在运行期间,它将计算xyz的值。我想将这些值用作案例条件。

  1. 有没有办法在switch中使用这些值?
  2. 如果我使用if else循环,而不是切换,ho
  3. id = 1;
    
    switch(id){
        case x:
            //call some function
            break;
        case y:
            //call some different function
            break;
        default:
            //error
            break;
        }
    

3 个答案:

答案 0 :(得分:4)

不,案例标签需要是编译时积分常量。

您需要使用条件语句:

if (id == x) {
  // ...
} else if (id == y) {
  // ...
} else if (id == z) {
  // ...
} else {
  // "default case"
}

另请注意,xyz可能并非全部不同,因此声明的顺序很重要。 (但是如果您通过其中任何一个案例标签,则该顺序对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,则会有所不同。