如何在C ++中的switch中使用boolean表达式

时间:2014-06-03 14:43:56

标签: c++ visual-c++ switch-statement

我需要将if else转换为switch语句,请帮助:

if (XMLString::compareString(xmlch_Title, XMLString::transcode("abc")) == 0 ) {
    out_Config.abc = XMLString::transcode(xmlch_Value);
} else if (XMLString::compareString(xmlch_Title, XMLString::transcode("def")) == 0 ) {
    out_Config.def = XMLString::transcode(xmlch_Value);
} .......

3 个答案:

答案 0 :(得分:2)

  

注意:在您的情况下,使用布尔表达式作为开关的条件将没什么用处,因为那时您只能有两个可能的结果 switch语句

     

转到"case true: ""case false: "


<强>简介

如标准(n3797)中所述,与开关一起使用的条件必须可隐式转换为整数或枚举类型。

  

6.4.2 p2 切换声明 [stmt.switch]

     
    

条件应为整数类型,枚举类型或类类型。如果是类类型,则将条件在上下文中隐式转换(第4节)为整数或枚举类型**。执行整体促销。 switch语句中的任何语句都可以用一个或多个case标签标记,如下所示:

case constant-expression:
         

其中,constant-expression应为切换条件的提升类型的转换常量表达式(5.19)。在转换为提升类型的开关条件后,同一开关中的两个外壳常数应具有相同的值。

  


这意味着下面的理论实现是不正确的,因为std::string不能隐式转换为整数或枚举类型(1),也不是可用于常量表达式 (2)

std::string get_string ();

switch (get_string ()) {            //          (1)
  case std::string ("stack"): ...;  // <----.
  case std::string ( "over"): ...;  // <----|-- (2)
  case std::string ( "flow"): ...;  // <----'
}



我完全没有运气了吗?

不是真的,如果您使用hashing function为所涉及的字符串生成哈希,理论上您可以使用开关< / em>的;请注意所有哈希的潜在碰撞。

另请注意, case-labels 常量表达式中必须有一个可用的实现。

是否值得编写如此复杂的代码来解决这类问题?可能不是。

答案 1 :(得分:0)

如果你想要分解公共部分,你可能需要使用包含转码字符串常量的struct数组和执行 then 操作的lambda。有点像:

#include <functional>

struct check_case {
  const XMLString code;
  const std::function <void (Config &, const XMLString &)> handler;
};

check_case check_list[2] = {
  {XMLString::transcode("abc"), [](Config &out_Config, const XMLString &code) { out_Config.abc = code;}},
  {XMLString::transcode("def"), [](Config &out_Config, const XMLString &code) { out_Config.def = code;}},
};

for (auto c : check_list) {
   if (XMLString::compareString(xmlch_Title,c.code) == 0){ 
     c.handler(out_Config, XMLString::transcode(xmlch_Value));
     break;
   }
}

但它仍然相当冗长,而且我不确定你会发现它更容易阅读。此外,您不能像使用普通开关那样级联您的处理程序(这可能是您提出问题的原因)。

或者,您可以将所有内容嵌入到专用类中,这样可以更容易地构建上下文(类实例成员字段)。在那里手动级联方法会更容易。如上所述,可读性也不尽如人意。

答案 2 :(得分:0)

从不同的角度来看待它。分两个阶段进行...... 第1阶段:在引号“abc”或“def”中提取文本 阶段2:切换(基于阶段1的变量)和案例将提供实现