簡體   English   中英

C ++ 11:常規枚舉,名稱空間和類型安全

[英]C++11: Regular enums, namespaces, and type safety

使用C ++ 11中的enum class ,您不能在不進行強制轉換的情況下將enum分配給int。 使用C ++ 11中的常規enum ,它不是類型安全的並且可以意外分配給int是否正確?

我希望做的是在帶有枚舉的名稱空間中捆綁助手功能:

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

在那種情況下,我已經有了color::white的名稱空間保護,但是我不認為這是類型安全的。 有沒有一種方法可以做到而又不過於冗長,例如帶有enum class color::Color::white

而不是名稱空間,一個類呢? 住在這里

#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;
*/
}    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM