Advertisement
homer512

Empty member private inheritance

May 25th, 2013
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.19 KB | None | 0 0
  1. #include <cstdio>
  2.  
  3. namespace {
  4.   class Empty
  5.   {
  6.   public:
  7.     void do_something()
  8.     {}
  9.   };
  10.   class NonEmpty
  11.   {
  12.     int foo;
  13.   public:
  14.     void do_something()
  15.     {}
  16.   };
  17.  
  18.   template<class T>
  19.   class EmptyMember
  20.   {
  21.     T member;
  22.     int foo;
  23.   public:
  24.     EmptyMember(const T& member):
  25.       member(member)
  26.     {
  27.       this->member.do_something();
  28.     }
  29.   };
  30.   template<class T>
  31.   class EmptyBase: private T
  32.   {
  33.     int foo;
  34.   public:
  35.     EmptyBase(const T& base):
  36.       T(base)
  37.     {
  38.       this->do_something();
  39.     }
  40.   };
  41.   template<class T>
  42.   EmptyMember<T> member_wrapper(const T& member)
  43.   {
  44.     return EmptyMember<T>(member);
  45.   }
  46.   template<class T>
  47.   EmptyBase<T> class_wrapper(const T& member)
  48.   {
  49.     return EmptyBase<T>(member);
  50.   }
  51.   template<class T>
  52.   size_t get_size(const T& obj)
  53.   {
  54.     return sizeof(obj);
  55.   }
  56. }
  57.  
  58. int main()
  59. {
  60.   Empty e;
  61.   NonEmpty n;
  62.   std::printf("Empty member: %zd; empty base: %zd\n",
  63.           get_size(member_wrapper(e)),
  64.           get_size(class_wrapper(e)));
  65.   std::printf("Non-empty member: %zd; non-empty base: %zd\n",
  66.           get_size(member_wrapper(n)),
  67.           get_size(class_wrapper(n)));
  68.  
  69.   return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement