Не совсем ответ на этот вопрос, а скорее другой подход к вашей проблеме. Мне легче выполнять тесты SFINAE по специализациям, а не по функциям, определенным в этом шаблоне:
// used to pass a type tested with SFINAE
template<typename T> struct tovoid { typedef void type; };
Использование его для передачи типа, который может быть недействительным:
template<typename T, typename U = void>
struct is_class {
static bool const value = false;
};
// if "int T::*" is a valid type, this specialization is used
template<typename T>
struct is_class<T, typename tovoid<int T::*>::type> {
static bool const value = true;
};
Таким образом, он значительно короче, а шум с sizeof
и ничего не сделано.