Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <type_traits>
- namespace details {
- template<typename T, bool IsEnum = std::is_enum<T>::value>
- struct is_unscoped_enum {
- using underlying_type = typename std::underlying_type<T>::type;
- using type = typename std::is_convertible<T, underlying_type>::type;
- };
- template<typename T>
- struct is_unscoped_enum<T, false> {
- using type = std::false_type;
- };
- template<typename T, bool IsEnum = std::is_enum<T>::value>
- struct is_scoped_enum {
- using underlying_type = typename std::underlying_type<T>::type;
- using type = std::integral_constant<bool, !std::is_convertible<T, underlying_type>::value>;
- };
- template<typename T>
- struct is_scoped_enum<T, false> {
- using type = std::false_type;
- };
- }
- template<typename T>
- struct is_unscoped_enum : details::is_unscoped_enum<T>::type { };
- template<typename T>
- struct is_scoped_enum : details::is_scoped_enum<T>::type { };
- #if __cpp_variable_templates == 201304
- template<typename T>
- constexpr bool is_unscoped_enum_v = is_unscoped_enum<T>::value;
- template<typename T>
- constexpr bool is_scoped_enum_v = is_scoped_enum<T>::value;
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement