#include <iostream>
#include <cassert>
#include <type_traits>

template<typename T> using Underlying = std::underlying_type_t<T>;

enum class ETest : int
{
    Zero = 0,
    One = 1,
    Two = 2
};

template<typename T> auto& castEnum(T& mX) noexcept
{
    return reinterpret_cast<Underlying<T>&>(mX);
}

template<typename T> const auto& castEnum(const T& mX) noexcept
{
    return reinterpret_cast<const Underlying<T>&>(mX);
}

int main()
{
    auto x(ETest::Zero);
    castEnum(x) = 1;
    assert(x == ETest::One);
    
    return 0;
}