fork(1) download
  1. #include <type_traits>
  2. #include <string>
  3. #include <iostream>
  4.  
  5. // Данные
  6. struct Base
  7. {};
  8.  
  9. struct A : Base
  10. {
  11. std::string name = "A";
  12. };
  13.  
  14. struct B : Base
  15. {
  16. std::string name = "B";
  17. };
  18.  
  19. // Геттеры
  20. template< typename T >
  21. struct Meta
  22. {
  23. static_assert(std::is_base_of<Base, T>::value, "");
  24.  
  25. public:
  26. explicit Meta( const T& data )
  27. : _data{ data }
  28. {}
  29.  
  30. std::string name() const
  31. {
  32. return "Name is: " + _data.name;
  33. }
  34.  
  35. const T* operator->() const
  36. {
  37. return &_data;
  38. }
  39.  
  40. private:
  41. const T& _data;
  42. };
  43.  
  44. template< typename T >
  45. Meta<T> Wrap( const T& data )
  46. {
  47. return Meta<T>{ data };
  48. }
  49.  
  50.  
  51. int main()
  52. {
  53. const A a;
  54. const B b;
  55. const auto wa = Wrap( a );
  56. const auto wb = Wrap( b );
  57.  
  58. std::cout << wa.name() << "\n";
  59. std::cout << wb.name() << "\n";
  60.  
  61. //for ( const auto& meta : { wa, wb } )
  62. // std::cout << meta.name() << "\n";
  63.  
  64. return 0;
  65. }
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
Name is: A
Name is: B