将 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
我正在寻找一种安全且可维护的方法来将 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