Advertisement
Radfler

::is_scoped_enum, ::is_unscoped_enum

May 4th, 2016
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.15 KB | None | 0 0
  1. #include <type_traits>
  2.  
  3. namespace details {
  4.  
  5.   template<typename T, bool IsEnum = std::is_enum<T>::value>
  6.   struct is_unscoped_enum {
  7.     using underlying_type = typename std::underlying_type<T>::type;
  8.     using type = typename std::is_convertible<T, underlying_type>::type;
  9.   };
  10.  
  11.   template<typename T>
  12.   struct is_unscoped_enum<T, false> {
  13.     using type = std::false_type;
  14.   };
  15.  
  16.   template<typename T, bool IsEnum = std::is_enum<T>::value>
  17.   struct is_scoped_enum {
  18.     using underlying_type = typename std::underlying_type<T>::type;
  19.     using type = std::integral_constant<bool, !std::is_convertible<T, underlying_type>::value>;
  20.   };
  21.  
  22.   template<typename T>
  23.   struct is_scoped_enum<T, false> {
  24.     using type = std::false_type;
  25.   };
  26.  
  27. }
  28.  
  29. template<typename T>
  30. struct is_unscoped_enum : details::is_unscoped_enum<T>::type { };
  31.  
  32. template<typename T>
  33. struct is_scoped_enum : details::is_scoped_enum<T>::type { };
  34.  
  35. #if __cpp_variable_templates == 201304
  36.  
  37. template<typename T>
  38. constexpr bool is_unscoped_enum_v = is_unscoped_enum<T>::value;
  39.  
  40. template<typename T>
  41. constexpr bool is_scoped_enum_v = is_scoped_enum<T>::value;
  42.  
  43. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement