“enum class” emulation or solid alternative for MSVC 10.0

后端 未结 3 584
无人共我
无人共我 2020-12-05 11:30

I\'m looking for a hacky kind of solution to the following problem: GCC 4.4+ accepts the following c++0x code:

enum class my_enum
{
    value1,
    value2
};         


        
3条回答
  •  佛祖请我去吃肉
    2020-12-05 12:13

    I just discovered a problem with James' good hack (which I have heretofore been using), and a fix to the problem. I discovered the problem when I tried to define a stream operator for my_enum.

    #include 
    
    struct my_enum {
        enum type { 
            value1, 
            value2 
        };
    
        my_enum(type v) : value_(v) { }
    
        operator type() const { return value_; }
    
    private:
    
        type value_;
    };
    
    std::ostream&
    operator<<(std::ostream& os, my_enum v)
    {
        return os << "streaming my_enum";
    }
    
    int main()
    {
        std::cout << my_enum::value1 << '\n';
    }
    

    The output is:

    0
    

    The problem is my_enum::value1 has different type than my_enum. Here's a hack to James' hack that I came up with.

    struct my_enum
    {
        static const my_enum value1;
        static const my_enum value2;
    
        explicit my_enum(int v) : value_(v) { }
    
        // explicit // if you have it!
           operator int() const { return value_; }
    
    private:
    
        int value_;
    };
    
    my_enum const my_enum::value1(0);
    my_enum const my_enum::value2(1);
    

    Notes:

    1. Unless otherwise specified by an enum-base, the underlying type of a scoped enumeration is int.
    2. Explicit conversions to and from the underlying integral type are allowed. But implicit conversions are not. Do your best.
    3. This hack is more of a pita than James' because of the need to enumerate the values twice. I'm hoping compilers without scoped enum support rapidly become extinct!

提交回复
热议问题