Skip to content

Instantly share code, notes, and snippets.

@iscgar
Created February 10, 2018 19:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iscgar/7c80afe3cececbb4bdf1b8e118f4a2dd to your computer and use it in GitHub Desktop.
Save iscgar/7c80afe3cececbb4bdf1b8e118f4a2dd to your computer and use it in GitHub Desktop.
C++ Version of __builtin_types_compatible_p
#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, "");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment