#include <type_traits>
template <typename E>
typename std::underlying_type<E>::type to_underlying(E e) {
return static_cast<typename std::underlying_type<E>::type>(e);
}
using uint = unsigned;
//enum class foo : unsigned { bar }; // works
enum class foo : uint { bar }; // fails
void f(unsigned) {}
int main() {
f(to_underlying(foo::bar));
f(static_cast<std::underlying_type<foo>::type>(foo::bar));
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGUgPHR5cGVuYW1lIEU+CnR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIHRvX3VuZGVybHlpbmcoRSBlKSB7CiAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RT46OnR5cGU+KGUpOwp9Cgp1c2luZyB1aW50ID0gdW5zaWduZWQ7Ci8vZW51bSBjbGFzcyBmb28gOiB1bnNpZ25lZCB7IGJhciB9OyAvLyB3b3JrcwplbnVtIGNsYXNzIGZvbyA6IHVpbnQgeyBiYXIgfTsgLy8gZmFpbHMKCnZvaWQgZih1bnNpZ25lZCkge30KCmludCBtYWluKCkgewogICAgZih0b191bmRlcmx5aW5nKGZvbzo6YmFyKSk7CiAgICBmKHN0YXRpY19jYXN0PHN0ZDo6dW5kZXJseWluZ190eXBlPGZvbz46OnR5cGU+KGZvbzo6YmFyKSk7Cn0KCg==