Can an enum class be converted to the underlying type?

后端 未结 4 1344
不思量自难忘°
不思量自难忘° 2020-11-28 01:57

Is there a way to convert an enum class field to the underlying type? I thought this would be automatic, but apparently not.

enum class my_field         


        
4条回答
  •  鱼传尺愫
    2020-11-28 02:37

    As others have pointed out there is no implicit cast, but you can use an explicit static_cast. I use the following helper functions in my code to convert to and from an enum type and its underlying class.

        template
        constexpr inline decltype(auto) getIntegralEnumValue(EnumType enumValue)
        {
            static_assert(std::is_enum::value,"Enum type required");
            using EnumValueType = std::underlying_type_t;
            return static_cast(enumValue);
        }
    
        template
        constexpr inline EnumType toEnum(IntegralType value)
        {
            static_assert(std::is_enum::value,"Enum type required");
            static_assert(std::is_integral::value, "Integer required");
            return static_cast(value);
        }
    
        template
        constexpr inline void setIntegralEnumValue(EnumType& enumValue, UnaryFunction integralWritingFunction)
        {
            // Since using reinterpret_cast on reference to underlying enum type is UB must declare underlying type value and write to it and then cast it to enum type
            // See discussion on https://stackoverflow.com/questions/19476818/is-it-safe-to-reinterpret-cast-an-enum-class-variable-to-a-reference-of-the-unde
    
            static_assert(std::is_enum::value,"Enum type required");
    
            auto enumIntegralValue = getIntegralEnumValue(enumValue);
            integralWritingFunction(enumIntegralValue);
            enumValue = toEnum(enumIntegralValue);
        }
    

    Usage code

    enum class MyEnum {
       first = 1,
       second
    };
    
    MyEnum myEnum = MyEnum::first;
    std::cout << getIntegralEnumValue(myEnum); // prints 1
    
    MyEnum convertedEnum = toEnum(1);
    
    setIntegralEnumValue(convertedEnum,[](auto& integralValue) { ++integralValue; });
    std::cout << getIntegralEnumValue(convertedEnum); // prints 2
    

提交回复
热议问题