Based on the test +T{} :
Option number 1:
SFINAE expression in return type:
#include <type_traits> template <typename T> auto test(int) -> decltype((void)+T{}, std::false_type{}); template <typename T> auto test(...) -> std::true_type; template <typename T> using is_enum_class = std::integral_constant<bool, decltype(test<T>(0))::value && std::is_enum<T>::value>;
Demo
Option number 2:
In void_t-fashion:
template <typename T, typename V = void> struct test : std::false_type {}; template <typename T> struct test<T, decltype((void)+T{})> : std::true_type {}; template <typename T> using is_enum_class = std::integral_constant<bool, !test<T>::value && std::is_enum<T>::value>;
Demo 2
Tests:
enum class EC { a, b }; enum E { c, d }; int main() { static_assert(is_enum_class<EC>::value, "!"); static_assert(!is_enum_class<E>::value, "!"); static_assert(!is_enum_class<int>::value, "!"); }
Piotr skotnicki
source share