Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.65 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct short2
  5. {
  6.   short x;
  7.   short y;
  8. };
  9.  
  10. struct short3
  11. {
  12.   short x;
  13.   short y;
  14.   short z;
  15. };
  16.  
  17. #define CREATE_MEMBER_DETECTOR(X)                                                   \
  18. template<typename T> class Detect_##X {                                             \
  19.     struct Fallback { int X; };                                                     \
  20.     struct Derived : T, Fallback { };                                               \
  21.                                                                                     \
  22.     template<typename U, U> struct Check;                                           \
  23.                                                                                     \
  24.     typedef char ArrayOfOne[1];                                                     \
  25.     typedef char ArrayOfTwo[2];                                                     \
  26.                                                                                     \
  27.     template<typename U> static ArrayOfOne & func(Check<int Fallback::*, &U::X> *); \
  28.     template<typename U> static ArrayOfTwo & func(...);                             \
  29.   public:                                                                           \
  30.     typedef Detect_##X type;                                                        \
  31.     enum { value = sizeof(func<Derived>(0)) == 2 };                                 \
  32. };
  33.  
  34. CREATE_MEMBER_DETECTOR(x);
  35. CREATE_MEMBER_DETECTOR(y);
  36. CREATE_MEMBER_DETECTOR(z);
  37.  
  38. int main()
  39. {
  40.   std::cout << Detect_z<short2>::value << std::endl;
  41.   std::cout << Detect_z<short3>::value << std::endl;
  42.   return 0;
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement