【发布时间】:2020-10-30 19:52:01
【问题描述】:
我在 myClass.h 中定义了一个枚举类:
enum class SpeedMode {
SPEED_SLOW = 0,
SPEED_NORMAL = 1,
SPEED_FAST = 2
};
在另一个文件中,我想将我的枚举用作 int:
void myOtherClass::myFunc(const SpeedMode& speed_mode) {
int speed_as_int = speed_mode;
.
.
.
}
在我定义我的枚举 (myClass.h) 的同一个文件中,我尝试定义一个运算符覆盖:
int operator= (const SpeedMode& mode) {
return static_cast<int>(mode); //The real logic is more complex and will use a switch statement
}
但我收到此错误:error: 'int operator=(const SpeedMode&)' must be a nonstatic member function。
如果我尝试将其包装在 struct SpeedModeUtils { } 之类的东西中,它允许该文件编译,但 myOtherClass 给了我这个错误,我尝试使用覆盖:
error: cannot convert 'const SpeedMode' to 'int' in initialization
我知道我可以使用旧的非类枚举,但这是一个大型项目,我更喜欢枚举类的类型安全。我也知道我可以使用 static_cast,但出于可能显而易见的原因,我宁愿避免这种情况。
如果失败,我将简单地使用手动转换功能,但我认为这将是一种“更好”的处理方式。
【问题讨论】:
-
什么是
SpeedMode?你的枚举被称为Speed你没有显示名为SpeedMode的结构 -
另外我还有一个。 1) 你为什么使用
enum class而不仅仅是enum?如果你使用后者,你的枚举将只是一个整数表示,你可以说int convertSpeedToInt(Speed mode) {return mode;} -
我希望枚举类具有类型安全性,不过是的,我认为我正在解决一个包含 switch 语句的简单辅助函数。
-
可以肯定的是,类型安全的意思是您可以避免与其他枚举和整数进行比较,对吗?
-
是的,这主要是描述它。还可以通过强制使用 SpeedMode::SPEED_SLOW 与仅使用 SPEED_SLOW 来避免名称冲突。