标签:
下面的代码在老的编译器上不work,我用gcc 4.8.2编译没问题
template <typename T> class is_class { typedef char YES; typedef int NO; template <typename U> static YES matcher(void (U::*)(void)); template <typename> static NO matcher(...); public: static const bool r = sizeof(matcher<T>(0)) == sizeof(YES); }; template <typename T> class is_public { typedef char YES; typedef int NO; template <typename U> static YES (&matcher(int))[1 + 0 * U::val]; template <typename> static NO matcher(...); public: static const bool r = sizeof(matcher<T>(0)) == sizeof(YES); }; template <typename T> class is_public_or_protected : private T { typedef char YES; typedef int NO; template <typename U> static YES (&matcher(int))[1 + 0 * is_public_or_protected<U>::val]; template <typename> static NO matcher(...); public: static const bool r = sizeof(matcher<T>(0)) == sizeof(YES); }; template <bool B, typename T> struct if_ { static const bool r = T::r; }; template <typename T> struct if_<false, T> { static const bool r = false; }; template <typename T> struct is_protected { static const bool r = if_< is_class<T>::r && !is_public<T>::r, is_public_or_protected<T> >::r; }; //test case #include <cstdio> static void test(bool r, const char * s) { printf("%-16s%s\n", r?"PASS":"FAILED", s); } #define TEST(x, b) test(is_protected<x>::r == b, #x) class int0 {}; class int1 { public: static const int val = 0; }; class int2 { protected: static const int val = 0; }; class int3 { private: static const int val = 0; }; template <typename T> class T1 : public T {}; template <typename T> class T2 : protected T {}; template <typename T> class T3 : private T {}; class int4 { protected: static const double val = 0; }; class int5 { protected: static const char val = 0; }; class int6 { protected: static const short val = 0; }; int main() { TEST(int, false); TEST(double, false); TEST(int0, false); TEST(int1, false); TEST(int2, true); TEST(int3, false); TEST(T1<int1>, false); TEST(T1<int2>, true); TEST(T1<int3>, false); TEST(T2<int1>, true); TEST(T2<int2>, true); TEST(T2<int3>, false); TEST(T3<int1>, false); TEST(T3<int2>, false); TEST(T3<int3>, false); TEST(int4, false); TEST(int5, true); TEST(int6, true); return 0; }
标签:
原文地址:http://my.oschina.net/2bit/blog/395054