可视化如何在c++中使用布尔表达式开关

visual how to use boolean expression in switch in C++

本文关键字:布尔表达式 开关 c++ 可视化      更新时间:2023-10-16

我需要将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);
} .......

注意:使用布尔表达式作为开关的条件,在你的情况下,几乎没有什么用处,因为你只能有两种可能的开关语句:

的结果

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


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

6.4.2 p2 switch语句 [stmt.switch]

条件必须是整型、枚举类型或类类型。如果是类类型,则上下文隐式地将条件转换(第4条)为整型或枚举类型**。执行积分提升。switch语句中的任何语句都可以使用一个或多个case标签进行标记,如下所示:

case constant-expression:

,其中常量表达式应为转换后的开关条件提升类型的常量表达式(5.19)。同一开关中的两个case常量转换为开关条件的提升类型后,不得具有相同的值。


这意味着下面的理论实现是病态的,因为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"): ...;  // <----'
}



我完全不走运吗?

不完全是,如果你要使用散列函数字符串生成散列,理论上你可以使用开关;只是要小心上述散列的潜在冲突。

还要注意,对于大小写标签,必须在常量表达式中有可用的实现。

值得写这么复杂的代码来解决这种问题吗?可能不会。

如果您想提出公共部分,您可能需要使用包含转码字符串常量和执行then操作的lambda的struct数组。类似以下语句:

#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;
   }
}

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

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

换个角度看。分两个阶段做……阶段1:提取引号"abc"或"def"中的文本阶段2:切换(基于阶段1的变量),case将提供实现