fork download
  1. #include<iostream>
  2.  
  3. template<typename T>
  4. struct invisible
  5. {
  6. static typename T::type value;
  7. };
  8.  
  9. template<typename T>
  10. typename T::type invisible<T>::value;
  11.  
  12. //////////////////////////////////////////////////////////////////////////
  13. template<typename T, typename T::type P>
  14. class construct_invisible
  15. {
  16. construct_invisible(){ invisible<T>::value = P; }
  17. static const construct_invisible instance;
  18. };
  19.  
  20. template<typename T, typename T::type P>
  21. const construct_invisible<T, P> construct_invisible<T, P>::instance;
  22.  
  23. //////////////////////////////////////////////////////////////////////////
  24. //////////////////////////////////////////////////////////////////////////
  25. class A
  26. {
  27. public:
  28. A(int x) : m_X(x){}
  29. private:
  30. int m_X;
  31. };
  32.  
  33. //////////////////////////////////////////////////////////////////////////
  34. struct A_x{ typedef int A::*type; };
  35. template class construct_invisible<A_x, &A::m_X>;// <---- WHY DOES `&A::m_X` WORK HERE?
  36.  
  37. //////////////////////////////////////////////////////////////////////////
  38. int main()
  39. {
  40. A a(17);
  41. std::cout << a.*invisible<A_x>::value << '\n';
  42. }
Success #stdin #stdout 0.02s 2724KB
stdin
Standard input is empty
stdout
17