编写多个 If 语句的优雅方式

Elegant way to write multiple If statements

本文关键字:方式 语句 If      更新时间:2023-10-16

我有以下多个'if'语句。

动物和人类是两个enum

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,以便可以屏蔽。(MenCatDogElement只有一个但唯一的位集(。具有掩码值的按位枚举器很常见。

然后你可以写

if (b & Animals::d_applies){
    d = 1;
}

至少,d_applies在哪里Animals::Cat | Animals::Dog

只要有可能,我发现某种基于表格的方法是最容易扩展的。我将用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++17,则可以将同一映射与结构化绑定一起使用:

auto [c, d, e] = value_getter[from_type{a, b}];

所以现在初始化是声明的一部分,并且是很好的有益健康的C++。

您可以安排一个包含"谓词,处理程序"等对的容器。然后,您可以迭代容器,并在相应的谓词匹配时调用处理程序。std::for_each 在所有设置代码完成后,这里的单行代码会很好。

附言但是,不确定它是否值得一颗子弹。