【发布时间】:2017-02-10 18:39:04
【问题描述】:
在我的项目中,我使用了多个枚举类,我需要根据需要在哪里使用它们轻松地在它们之间进行转换。它们基本上描述了相同的东西,但名称不同,以使代码更易于使用。以下是枚举类:
enum class tetroType {
None, I, O, T, J, L, S, Z
};
enum class gridBlock {
Empty, Blue, Green, Orange, Purple, Red, Teal, Yellow
};
tetroType 中的每个值对应于 gridBlock 中的一个值(fe tetroType::I = gridBlock::Teal),但第一个保存有关 tetronimo 形状的信息(在 tetronimo 类中),第二个保存有关颜色的信息块(在网格类中)。我知道我可以只使用一个枚举,但这样你就不会丢失任何信息。如果可能的话,我还需要将它转换成字符串。这就是我想使用它的方式:
gridBlock grid = (gridBlock)tetroType::I;
string texture = (string)grid;
现在我设置它的方式是这样的。每当我需要将一个枚举转换为另一个枚举或字符串时,我都会在其他方法的中间使用此开关:
switch (type) {
case tetroType::I:
block = gridBlock::Teal;
break;
case tetroType::O:
block = gridBlock::Yellow;
break;
case tetroType::T:
block = gridBlock::Purple;
break;
case tetroType::J:
block = gridBlock::Blue;
break;
case tetroType::L:
block = gridBlock::Orange;
break;
case tetroType::S:
block = gridBlock::Green;
break;
case tetroType::Z:
block = gridBlock::Red;
break;
case tetroType::None:
block = gridBlock::Empty;
}
【问题讨论】:
-
铸造不应该“轻易”完成。它应该是详细而明确的,这样你就不会过于随意地进行转换。必须写
gridBlock grid = toGridBlock(tetroType::I)和string texture = toString(grid);是一件好的事情。 -
我一直在寻找最优雅和最正确的方法,并且我已经拥有将一个转换为另一个的功能,但我不确定它是否是正确的方法。该功能应该在哪里?它应该与枚举声明一起在头文件中吗?这就是为什么我认为如果可能的话,演员表操作符将是最优雅的解决方案。
-
这有点基于意见,但就我个人而言,我更喜欢将转换函数放在自己的标题中,这样我只需要在需要时才包含它们。再说一次,标准库本身并不(总是)这样做。例如,
<string>包含std::string和各种std::to_string函数。