Guest User

Untitled

a guest
Feb 23rd, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.76 KB | None | 0 0
  1. #include <stddef.h>
  2.  
  3. namespace detail
  4. {
  5. template<class, class> struct is_compatible { enum { value = 0 }; };
  6.  
  7. template<class T> struct is_compatible<T, T> { enum { value = 1 }; };
  8. template<class T, size_t N> struct is_compatible<T[], T[N]> { enum { value = 1 }; };
  9. template<class T, size_t N> struct is_compatible<T[N], T[]> { enum { value = 1 }; };
  10.  
  11. template<class T, class U> struct is_compatible<T, U const volatile> : is_compatible<T, U> {};
  12. template<class T, class U> struct is_compatible<T const volatile, U> : is_compatible<T, U> {};
  13. template<class T, class U> struct is_compatible<T const, U const volatile> : is_compatible<T, U> {};
  14. template<class T, class U> struct is_compatible<T const volatile, U const> : is_compatible<T, U> {};
  15. template<class T, class U> struct is_compatible<T volatile, U const volatile> : is_compatible<T, U> {};
  16. template<class T, class U> struct is_compatible<T const volatile, U volatile> : is_compatible<T, U> {};
  17. template<class T, class U> struct is_compatible<T const, U volatile> : is_compatible<T, U> {};
  18. template<class T, class U> struct is_compatible<T volatile, U const> : is_compatible<T, U> {};
  19. template<class T, class U> struct is_compatible<T, U const> : is_compatible<T, U> {};
  20. template<class T, class U> struct is_compatible<T const, U> : is_compatible<T, U> {};
  21. template<class T, class U> struct is_compatible<T, U volatile> : is_compatible<T, U> {};
  22. template<class T, class U> struct is_compatible<T volatile, U> : is_compatible<T, U> {};
  23. }
  24.  
  25. static_assert(detail::is_compatible<int, int>::value, "");
  26. static_assert(detail::is_compatible<int, const int>::value, "");
  27. static_assert(detail::is_compatible<const int, int>::value, "");
  28. static_assert(detail::is_compatible<int, volatile int>::value, "");
  29. static_assert(detail::is_compatible<volatile int, int>::value, "");
  30. static_assert(detail::is_compatible<const volatile int, int>::value, "");
  31. static_assert(detail::is_compatible<int, const volatile int>::value, "");
  32. static_assert(detail::is_compatible<const volatile int, const int>::value, "");
  33. static_assert(detail::is_compatible<const int, const volatile int>::value, "");
  34. static_assert(detail::is_compatible<const volatile int, volatile int>::value, "");
  35. static_assert(detail::is_compatible<volatile int, const volatile int>::value, "");
  36. static_assert(detail::is_compatible<int[], int[5]>::value, "");
  37. static_assert(detail::is_compatible<int[5], int[5]>::value, "");
  38. static_assert(!detail::is_compatible<const int*, int*>::value, "");
  39. static_assert(!detail::is_compatible<volatile int*, int*>::value, "");
  40. static_assert(!detail::is_compatible<int*, const int*>::value, "");
  41. static_assert(!detail::is_compatible<int*, volatile int*>::value, "");
  42. static_assert(!detail::is_compatible<int[5], int[6]>::value, "");
Add Comment
Please, Sign In to add comment