将 int 转换为枚举的安全且可维护的方法 class

Safe and maintainable way to convert int to enum class

我正在寻找一种安全且可维护的方法来将 int 值转换为 enum class。我知道我可以通过简单地使用 static_cast 将非整数值转换为 enum class,但我想确保要转换的值在转换之前或之后确实在枚举 class 中具有表示形式.

现在想到的都是 switch 语句,其中包含 enum class.

的所有条目的案例
enum class Entries { A, B, C }

switch(number)
{
case static_cast<int>(Entries::A): return Entries::A;
case static_cast<int>(Entries::B): return Entries::B;
case static_cast<int>(Entries::C): return Entries::C;
default: // Handle error here
}

但这不是很容易维护,因为每次添加新条目或删除旧条目时,都必须更改此 switch 语句。我希望即使 enum class 发生变化,我也不必再次触摸。

您可以使用宏创建枚举和 switch 语句,这样您就可以安全地添加新值:

// In header file
#define ENUM_VALUES(x) \
  x(A) \
  x(B) \
  x(C)       

#define CREATE_ENUM(name) \
  name,

enum class Entries { ENUM_VALUES(CREATE_ENUM) }

// In source file
#define CREATE_SWITCH(name) \
  case static_cast<int>(Entries::name): return Entries::name;

switch(number)
{
ENUM_VALUES(CREATE_SWITCH)
default: // Handle error here
}

基于this answer.

也许你可以用这个

//define your enum here
#define MacFunction(XX) \
XX(TypeA,0)\
XX(TypeB,2)\
XX(TypeC,3)

enum class Entries{
#define EnumDef(Type,Number) Type = Number,
    MacFunction(EnumDef)

    Unexpected,
#undef EnumDef
};
Entries SafeCastFromInt( int n )
{
#define SafeCast( Type,_ ) case static_cast<int>(Entries::Type):return Entries::Type;
    switch( n )
    {
        MacFunction(SafeCast)
        default:
        std::cout<<"error cast:"<<n<<std::endl;
        break;
    }
    return Entries::Unexpected;
#undef SafeCast
}
int main()
{
    SafeCastFromInt(0);
    SafeCastFromInt(1);
    SafeCastFromInt(2);
}

输出是

error cast:1