在初始化时将'char'转换为枚举

时间:2014-02-28 11:39:20

标签: c++11 enums

我正在尝试使用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

由于

2 个答案:

答案 0 :(得分:1)

尝试

VectorType vt {4, ElementType::signedInt, 32};

或者,使用普通enum

enum ElementType {
    unknown,
    signedInt
};

然后说

VectorType vt {4, signedInt, 32};

enum class专门设计为不允许隐式转换。我无法看到您希望从charElementType的自动转换。

如果你肯定需要这样的映射,例如要转换用户输入,您可以使用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};