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