Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stddef.h>
- namespace detail
- {
- template<class, class> struct is_compatible { enum { value = 0 }; };
- template<class T> struct is_compatible<T, T> { enum { value = 1 }; };
- template<class T, size_t N> struct is_compatible<T[], T[N]> { enum { value = 1 }; };
- template<class T, size_t N> struct is_compatible<T[N], T[]> { enum { value = 1 }; };
- template<class T, class U> struct is_compatible<T, U const volatile> : is_compatible<T, U> {};
- template<class T, class U> struct is_compatible<T const volatile, U> : is_compatible<T, U> {};
- template<class T, class U> struct is_compatible<T const, U const volatile> : is_compatible<T, U> {};
- template<class T, class U> struct is_compatible<T const volatile, U const> : is_compatible<T, U> {};
- template<class T, class U> struct is_compatible<T volatile, U const volatile> : is_compatible<T, U> {};
- template<class T, class U> struct is_compatible<T const volatile, U volatile> : is_compatible<T, U> {};
- template<class T, class U> struct is_compatible<T const, U volatile> : is_compatible<T, U> {};
- template<class T, class U> struct is_compatible<T volatile, U const> : is_compatible<T, U> {};
- template<class T, class U> struct is_compatible<T, U const> : is_compatible<T, U> {};
- template<class T, class U> struct is_compatible<T const, U> : is_compatible<T, U> {};
- template<class T, class U> struct is_compatible<T, U volatile> : is_compatible<T, U> {};
- template<class T, class U> struct is_compatible<T volatile, U> : is_compatible<T, U> {};
- }
- static_assert(detail::is_compatible<int, int>::value, "");
- static_assert(detail::is_compatible<int, const int>::value, "");
- static_assert(detail::is_compatible<const int, int>::value, "");
- static_assert(detail::is_compatible<int, volatile int>::value, "");
- static_assert(detail::is_compatible<volatile int, int>::value, "");
- static_assert(detail::is_compatible<const volatile int, int>::value, "");
- static_assert(detail::is_compatible<int, const volatile int>::value, "");
- static_assert(detail::is_compatible<const volatile int, const int>::value, "");
- static_assert(detail::is_compatible<const int, const volatile int>::value, "");
- static_assert(detail::is_compatible<const volatile int, volatile int>::value, "");
- static_assert(detail::is_compatible<volatile int, const volatile int>::value, "");
- static_assert(detail::is_compatible<int[], int[5]>::value, "");
- static_assert(detail::is_compatible<int[5], int[5]>::value, "");
- static_assert(!detail::is_compatible<const int*, int*>::value, "");
- static_assert(!detail::is_compatible<volatile int*, int*>::value, "");
- static_assert(!detail::is_compatible<int*, const int*>::value, "");
- static_assert(!detail::is_compatible<int*, volatile int*>::value, "");
- static_assert(!detail::is_compatible<int[5], int[6]>::value, "");
Add Comment
Please, Sign In to add comment