将自定义类隐式转换为枚举类

时间:2017-03-03 13:52:58

标签: c++ enums casting enum-class

我想创建一个类,它可以隐式转换为选定的枚举类,以便切换它。但是下面的代码没有编译(gcc)。编译器抱怨转换是不明确的,但它也不能用单个转换运算符编译(任何一个)。如何实现这种行为?

enum class G : int {
    A,
    B = 0x100,
};

enum class B : int {
    B1 = 0x100,
    B2
};

struct Foo {
    int s;

    operator G() {
        return static_cast<G>(s & ~0xff);
    }

    operator B() {
        return static_cast<B>(s);
    }
};

void foo() {
    Foo s;
    s.s = static_cast<int>(B::B1);

    switch (s) {
        case G::A:
            break;
        default:
            break;
    }

    switch (s) {
        case B::B1:
            break;
        default:
            break;
    }
}

1 个答案:

答案 0 :(得分:1)

由于您有两个转换运算符,因此使用切换表达式时非常模糊。您可以使用功能样式广播将其显式转换为您选择的enum类型:

switch (G(s)) {
    case G::A:
        break;
    default:
        break;
}

switch (B(s)) {
    case B::B1:
        break;
    default:
        break;
}

Demo