重载枚举类的强制转换运算符

Mar*_*ťko 8 c++ enums casting c++11

在我的项目中,我使用了多个枚举类,我需要根据需要在何处使用它们轻松地在它们之间进行转换。它们基本上描述相同的东西,但命名不同,以使代码更易于使用。以下是枚举类:

enum class tetroType {
    None, I, O, T, J, L, S, Z
};

enum class gridBlock {
    Empty, Blue, Green, Orange, Purple, Red, Teal, Yellow
};
Run Code Online (Sandbox Code Playgroud)

tetroType 中的每个值都对应于 gridBlock 中的一个值(fe tetroType::I = gridBlock::Teal),但第一个包含有关 tetronimo 形状的信息(在 tetronimo 类中),第二个包含有关块颜色的信息(在网格类)。我知道我可以只使用一个枚举,但这样你就不会丢失任何信息。如果可能的话,我还需要将其转换为字符串。这就是我想使用它的方式:

gridBlock grid = (gridBlock)tetroType::I;
string texture = (string)grid;
Run Code Online (Sandbox Code Playgroud)

现在我设置它的方式是这样的。每当我需要将一个枚举转换为另一个枚举或字符串时,我都会在其他方法的中间使用此开关:

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;
}
Run Code Online (Sandbox Code Playgroud)

Gam*_*bit 8

简单的回答:不要使用enum classenum而是使用普通,它们可以隐式转换为它们的基础类型(默认int)。

在C ++ 11,enum class是一种强的别名,其HAS从铸造。


小智 5

您应该考虑将枚举类重载为整数(这是 C++ 11 的功能)。

enum class tetroType : int {
    I = 1, O = 2, T = 3, J = 4, L = 5, S = 6, Z = 7, NONE
};

enum class gridBlock : int {
    Blue = 1, Green = 2, Orange = 3, Purple = 4, Red = 5, Teal = 6, Yellow = 9, EMPTY
};
Run Code Online (Sandbox Code Playgroud)

从这里您可以使用以太 C 风格类型转换或 static_cast 编写基本转换

gridBlock ConvertTetro(tetroType type){
    return static_cast<gridBlock>(static_cast<int>(type));
}

gridBlock ConvertTetro(tetroType type){
    return (gridBlock)((int)((type)));
}
Run Code Online (Sandbox Code Playgroud)

这会将任何网格块匹配为相等的 tetrotype,如果没有匹配的类型,则默认为 gridBlock::EMPTY。如果需要的话,这个函数应该很容易弄清楚如何走其他路。从这里您需要匹配两者之间的 int 值。

您还可以使用 char 值作为 char 文字('A'、'b'、'!')

enum class enumName : char
Run Code Online (Sandbox Code Playgroud)

只要两种底层类型都有效,这就可以工作