我正在尝试使用enum class
,但发现难以从具有逻辑对应关系的其他类型转换为枚举。这是一个例子:
enum class ElementType {
unknown,
signedInt
};
struct VectorType {
int vectorSize;
ElementType elementType;
int elementSize;
}
我希望能够通过说
来初始化VectorType
VectorType vt {4, 's', 32};
所以我尝试从char到enum定义一个强制转换操作:
operator ElementType(char c) {
switch (c) {
case 's': return ElementType::signedInt;
default : return ElementType::unknown;
}
}
但这不起作用,因为它会出现以下错误:
error: ‘operator ElementType(char)’ must be a nonstatic member function
因此,我能想出的唯一解决方案是创建一个单独的构造函数:
VectorType(int vsz, char etp, int esz) {
vectorSize = vsz;
elementType = make_elementType(etp);
elementSize = esz;
}
并让全局非成员make_elementType()函数处理转换。有没有办法避免这种情况,即有没有办法使用VectorType vt {4, 's', 32};
初始化VectorType
?
由于
答案 0 :(得分:1)
尝试
VectorType vt {4, ElementType::signedInt, 32};
或者,使用普通enum
enum ElementType {
unknown,
signedInt
};
然后说
VectorType vt {4, signedInt, 32};
enum class
专门设计为不允许隐式转换。我无法看到您希望从char
到ElementType
的自动转换。
如果你肯定需要这样的映射,例如要转换用户输入,您可以使用std::map<char, ElementType>
,但这与enum
s的哲学完全相反。
至于您的operator ElementType(char c)
,就像编译器所说的那样,这样的转化运算符只允许作为class
的成员而不允许作为char
等内置类型。
答案 1 :(得分:1)
您应该定义枚举值:
enum class ElementType : char {
unknown = 'u',
signedInt = 's'
};
class
关键字添加范围保护并删除值的隐式转换;你不能分开这两个功能。如果你想用这种现代风格写作,最好的方法是在初始化中明确地转换:
VectorType vt {4, static_cast< ElementType >( 's' ), 32};
或者,对于C风格的演员来说有点宽松,
VectorType vt {4, (ElementType) 's', 32};