#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2Fzc2VydD4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gdXNpbmcgVW5kZXJseWluZyA9IHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8VD47CgplbnVtIGNsYXNzIEVUZXN0IDogaW50CnsKICAgIFplcm8gPSAwLAogICAgT25lID0gMSwKICAgIFR3byA9IDIKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IGF1dG8mIGNhc3RFbnVtKFQmIG1YKSBub2V4Y2VwdAp7CiAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxVbmRlcmx5aW5nPFQ+Jj4obVgpOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdCBhdXRvJiBjYXN0RW51bShjb25zdCBUJiBtWCkgbm9leGNlcHQKewogICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVW5kZXJseWluZzxUPiY+KG1YKTsKfQoKaW50IG1haW4oKQp7CiAgICBhdXRvIHgoRVRlc3Q6Olplcm8pOwogICAgY2FzdEVudW0oeCkgPSAxOwogICAgYXNzZXJ0KHggPT0gRVRlc3Q6Ok9uZSk7CiAgICAKICAgIHJldHVybiAwOwp9