在C ++ 11中,使用enum class不能在不进行强制转换的情况下将枚举分配给int。使用C ++ 11中的常规enum,它不是类型安全的并且可以意外分配给int是否正确?

我希望做的是在带有枚举的名称空间中捆绑助手功能:

namespace color {
    enum Color { white, black, none };
    Color opposite (Color c);
    Color is_valid (Color c);
    // etc...
}


在那种情况下,我已经有了color::white的名称空间保护,但是我不认为这是类型安全的。有没有办法做到而不会太冗长,即color::Color::whiteenum class

最佳答案

而不是名称空间,一个类呢? (live here

#include <iostream>

class color {
public:
    enum internal_color { red, green, blue };
    color(internal_color c_): c(c_) {}
    operator internal_color() { return c; }
    color opposite() { return color(internal_color(blue - c)); }
    static bool invalid_color(int i) { return i < red || i > blue; }
    static color validated_color(int i) { if( invalid_color(i) ) throw "blblb"; return color(internal_color(i)); }
private:
    internal_color c;
};

int main() {
    color c(color::red);
    std::cout << c << std::endl;
    auto d = color::validated_color(1);
    std::cout << d << std::endl;
    auto x = c.opposite();
    std::cout << x << std::endl;
    auto e = color::invalid_color(3);
    std::cout << e << std::endl;
/*
    color f(5); // does not compile in c++11
    std::cout << f << std::endl;
*/
}

07-24 09:23