可视化如何在c++中使用布尔表达式开关
visual how to use boolean expression in switch in C++
我需要将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将提供实现
- 提升精神:解析布尔表达式并简化为规范范式
- C++ : 为什么必须添加布尔表达式?
- 我的作业问题:布尔表达式
- 是否可以定义以后可以计算的布尔表达式
- 布尔表达式的值是什么
- 布尔表达式的奇怪评估
- 布尔表达式是否像使用 if 或 switch 进行分支一样繁琐?
- 无限模板递归,因为没有布尔表达式优化,只有 gcc
- 是否有任何合理的场景,程序员可能希望避免布尔表达式的短路计算
- 注 961:违反 MISRA 2004 咨询规则 12.6,运算符所需的布尔表达式:"!"
- 使用提升的布尔表达式
- 在C++上给定布尔表达式的情况下分配整数值
- 布尔表达式的精神解析器
- 多个布尔表达式,而不重新插入变量
- C++ 循环和布尔表达式
- 编写布尔表达式以判断列表是否在增加
- 布尔表达式习语中的字符串文字是什么
- 布尔表达式在C++中解析和计算
- 布尔表达式中带有 strlen() 的奇怪行为
- 可视化如何在c++中使用布尔表达式开关