вторник, 9 января 2024 г.

Статический полиморфизм в С++

 #include <iostream>  
   
 // ------------------------ interface ------------------------  
 template<typename T>  
 struct IMeta  
 {  
   inline void foo() { return static_cast<T*>(this)->_foo(); }  
 };  
   
 template<typename T>  
 struct IPayload  
 {  
   inline void bar() { return static_cast<T*>(this)->_bar(); }  
 };  
   
 template<typename T>  
 struct IStream : public T, public IPayload<IStream<T>>, public IMeta<IStream<T>>  
 {  
   inline void baz() { return static_cast<T*>(this)->_baz(); }  
 };  
   
 // ------------------------ implementation ------------------------  
 template<typename T>  
 class Meta  
 {  
   friend class IMeta<IStream<T>>;  
   
   inline void _foo()  
      {  
           std::cout << "Meta::_foo::a = " << static_cast<T*>(this)->a << std::endl;  
      }  
 };  
   
 template<typename T>  
 class Payload  
 {  
   friend class IPayload<IStream<T>>;  
   
   inline void _bar()  
      {  
           std::cout << "Payload::_bar::a = " << static_cast<T*>(this)->a << std::endl;  
      }  
 };  
   
 class Stream : public Meta<Stream>, public Payload<Stream>  
 {  
   friend class IStream<Stream>;  
   friend class Meta<Stream>;  
   friend class Payload<Stream>;  
     
   uint64_t a = 3;  
   
   inline void _baz()  
      {  
           std::cout << "Stream::_baz::a = " << a << std::endl;  
      }  
 };  
   
 // ------------------------ usage ------------------------  
 int main()  
 {  
   IStream<Stream> stream;  
   
   stream.foo();  
   stream.bar();  
   stream.baz();  
   
   return 0;  
 }  
   

Комментариев нет:

Отправить комментарий