我需要将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);
} .......
答案 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的变量)和案例将提供实现