fork(1) download
  1. #include <type_traits>
  2. #include <string>
  3. #include <iostream>
  4. #include <functional>
  5.  
  6. // Данные
  7. struct Base
  8. {};
  9.  
  10. struct A : Base
  11. {
  12. std::string name = "A";
  13. };
  14.  
  15. struct B : Base
  16. {
  17. std::string name = "B";
  18. };
  19. struct Meta
  20. {
  21. public:
  22. template< typename T >
  23. explicit Meta( const T& data )
  24. : _data{data}
  25. , getName{
  26. [](const Base& base) {
  27. return static_cast<const T&>(base).name;
  28. }
  29. }
  30. {
  31. static_assert(std::is_base_of<Base, T>::value, "");
  32. }
  33.  
  34. std::string name() const
  35. {
  36. return "Name is: " + getName(_data);
  37. }
  38.  
  39. private:
  40. const Base& _data;
  41. std::function<std::string(const Base&)> getName;
  42. };
  43.  
  44. template< typename T >
  45. Meta Wrap( const T& data )
  46. {
  47. return Meta{ 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 15240KB
stdin
Standard input is empty
stdout
Name is: A
Name is: B
Name is: A
Name is: B