【发布时间】:2020-08-21 10:52:30
【问题描述】:
能否重构此代码以避免复制 switch 语句?
enum class Animal
{ Cat, Dog, Fish};
float GetMaxSpeed(Animal a)
{
switch (a)
{
case Animal::Cat:
return 30;
case Animal::Dog:
return 40;
case Animal::Fish:
return 15;
}
}
string GetGermanTranslation(Animal a)
{
switch (a)
{
case Animal::Cat:
return "Katze";
case Animal::Dog:
return "Hund";
case Animal::Fish:
return "Fische";
}
}
显然,这是一个玩具示例,我真正的枚举类要大得多。
【问题讨论】:
-
看起来很简单。根据枚举值的数量,您是否尝试简单地使用枚举枚举值的映射或数组,并给出相应的速度和翻译?或者,如果保证枚举值在数字上是连续的,那么两者的简单数组?任何地方都不需要 switch 语句。
-
考虑使用不同的方法:
const AnimalData animalData[] = {{Animal::Cat, 30, "Katze"}, {Animal::Dog, 40, "Hund"}, {Animal::Fish, 15, "Fische"}};- 不幸的是 C++ 不支持指定的初始化语法,[Animal::Cat] = {30, "Katze"} -
@user253751 你能详细说明一下吗,最好在答案中。
-
@SamVarshavchik 谢谢,这也非常有用。在没有直接映射的情况下,例如最大速度未知时,是否有任何解决方案?
-
地图 (
std::map) 可用于过滤掉稀疏索引,但这似乎有点过头了。对于某些情况下可能不存在的功能,您可以使用std::optional。或者您可以使用std::bitset来跟踪现有功能。
标签: c++ switch-statement boilerplate