I\'m trying to implement std::is_enum
. Here is my code so far:
template
struct is_enum {
static bool value;
};
template
The best way to implement this is to use compiler magic, and I believe most implementations do this.
For example, here's libc++'s implementation for gcc >= 4.3 and any compiler that __has_feature(is_enum)
1
template struct _LIBCPP_VISIBLE is_enum
: public integral_constant {};
For all other compilers libc++ does:
template struct _LIBCPP_VISIBLE is_enum
: public integral_constant::value &&
!is_integral<_Tp>::value &&
!is_floating_point<_Tp>::value &&
!is_array<_Tp>::value &&
!is_pointer<_Tp>::value &&
!is_reference<_Tp>::value &&
!is_member_pointer<_Tp>::value &&
!is_union<_Tp>::value &&
!is_class<_Tp>::value &&
!is_function<_Tp>::value > {};
Some of those other type traits still require compiler magic.2 E.g. is_union
. However, that condition can be rewritten such that it doesn't need compiler magic. This can be done by replacing the seperate checks for unions and classes with a single check for both, as Johannes Schaub points out.
1. So far as I know only clang implements __has_feature
, unfortunately.
2. It's interesting that libc++ does have a version of is_union
and is_class
that do not use compiler intrinsics, but as a result they provide erroneous results for union types. But their erroneous results are complementary so libc++'s fallback implementation of is_enum
provides accurate results.