Advertisement
Jakowlew

Статический полиморфизм на концептах

Mar 2nd, 2021
1,133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include <iostream>
  2. #include <concepts>
  3. #include <string>
  4.  
  5. // Интерфейс
  6.  
  7. template <typename T>
  8. concept ResourceManager = requires(T&& t, const std::string& filename) { { t.read(filename) } -> std::convertible_to<typename T::resource_t&>; }
  9.                        && requires(T&& t                             ) { { t.show()         } -> std::same_as<void>;                           }
  10.                        ;
  11.  
  12. template <typename T, typename Resource>
  13. struct IResourceManager
  14. {
  15.     using resource_t = Resource;
  16.     IResourceManager() { static_assert(ResourceManager<T>, "IResourceManager not implemented properly"); };
  17.     IResourceManager(IResourceManager&&) = default;
  18. };
  19.  
  20. // Реализации
  21.  
  22. class StringManager : public IResourceManager<StringManager, std::string>
  23. {
  24. public:
  25.     std::string& read(const std::string& filename)
  26.     {
  27.         m_resource = std::move(filename);
  28.         return m_resource;
  29.     }
  30.     void show()
  31.     {
  32.         std::cout << m_resource << std::endl;
  33.     }
  34. private:
  35.     std::string m_resource;
  36. };
  37.  
  38. class IntManager : public IResourceManager<IntManager, int>
  39. {
  40. public:
  41.     int& read(const std::string& filename)
  42.     {
  43.         m_resource = std::stoi(filename);
  44.         return m_resource;
  45.     }
  46.     void show()
  47.     {
  48.         std::cout << m_resource << std::endl;
  49.     }
  50. private:
  51.     int m_resource;
  52. };
  53.  
  54. template <ResourceManager T>
  55. void foo(T&& x)
  56. {
  57.     x.show();
  58. };
  59.  
  60. int main()
  61. {
  62.  
  63.     StringManager stringManager;
  64.     stringManager.read("Hello");
  65.     stringManager.show();
  66.  
  67.     IntManager intManager;
  68.     intManager.read("123");
  69.     intManager.show();
  70.  
  71.     foo(std::move(stringManager));
  72.  
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement