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

时间:2018-04-16 10:48:22

标签: c++

我有以下多个'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;
}

我怎样才能在一个陈述中写下所有内容,因此意思仍然相同。

先谢谢。

3 个答案:

答案 0 :(得分:7)

您可以使用特定值设置Men,以便可以使用屏蔽。 (CatDogElementif (b & Animals::d_applies){ d = 1; } 只有一个但唯一的位集。具有屏蔽值的按位枚举器很常见。

然后你可以写

d_applies

至少Animals::Cat | Animals::Doglet arr = [["11":11,"12":12],["21":21,"22":22]] let dic = arr[0] let dic1 = arr.first for item in arr { let dic = item }

答案 1 :(得分:5)

只要有可能,我发现某种基于制表的方法最容易扩展。我将使用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 ++。

答案 2 :(得分:0)

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

P.S。然而,不确定它是否值得一颗子弹。