C++ 编写多个If语句的优雅方式
我有以下多个“如果”语句 动物和人类是两个C++ 编写多个If语句的优雅方式,c++,C++,我有以下多个“如果”语句 动物和人类是两个enums Var a, b; int c, d, e = 0; if (a == Humans ::Men) { c = 1; } if (b == Animals ::Cat) { d= 1; e= 1; } if (b == Animals ::Dog) { d = 1; } if (b == Animals ::Elephant) { e = 1; } 我怎样才能把所有的东西都写在一句话里,使意思
enum
s
Var a, b;
int c, d, e = 0;
if (a == Humans ::Men) {
c = 1;
}
if (b == Animals ::Cat) {
d= 1;
e= 1;
}
if (b == Animals ::Dog) {
d = 1;
}
if (b == Animals ::Elephant) {
e = 1;
}
我怎样才能把所有的东西都写在一句话里,使意思仍然是一样的呢
提前感谢。您可以使用特定值设置您的
枚举
,以便可以进行屏蔽。(男人
,猫
,狗
,元素
有一个唯一的位集)。具有屏蔽值的位枚举数是常见的
然后你就可以写了
if (b & Animals::d_applies){
d = 1;
}
其中,
d_至少适用于is动物::猫|动物::狗
您可以安排一个包含诸如“谓词,处理程序”之类的对的容器。然后,如果相应的谓词不匹配,您可以迭代容器并调用处理程序。std::for_在完成所有设置代码之后,在这里每个都是一行
不过,我不确定它是否值得一试。只要有可能,我发现某种基于表格的方法是最容易扩展的。我将用std::map
演示,但您可以使用其他种类的簿记数据结构。只需定义从可能的枚举值对到要分配给变量的三元组值的映射:
using from_type = std::tuple<Humans, Animals>;
using to_type = std::tuple<int, int, int>;
std::map<from_type, to_type> value_getter {
{ from_type{Humans::Men, Animals::Cat}, to_type{0, 1, 1} },
// etc.
};
int c, d, e;
std::tie(c, d, e) = value_getter[from_type{a, b}];
现在,初始化是声明的一部分,是有益的C++。
没有简单的方法。将所有内容塞入一条语句是可能的,但会严重损害可读性。什么是Var
,为什么允许为其分配不同类型的enum
?这似乎是不明智的。另外,请注意,您的声明只将0
赋值给e
,因此您可能会遇到c
和d
从未初始化的情况,这将是非常糟糕的。(我假设你真的从其他地方传递了a
和b
,而不是将它们声明为空……不过,你应该始终发布完整的可编译代码,而不是要求读者猜测。)旁白:开始时唯一为0的变量是e
<代码>c
和d
都未初始化。
auto [c, d, e] = value_getter[from_type{a, b}];