Advertisement
Guest User

Untitled

a guest
Oct 19th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <tuple>
  2. #include <iostream>
  3. #include <utility>
  4.  
  5. template <typename... Ts>
  6. class ModuleBase // Baza dla każdego modułu
  7. {
  8. public:
  9.  
  10.     template <typename... Us>
  11.     ModuleBase(std::tuple<Us...>& _Tuple) :
  12.         m_Modules(std::get<Ts>(_Tuple)...) {} // Magia, pobranie odpowiednich modułów z listy
  13.  
  14.     ModuleBase(const ModuleBase&) = delete;
  15.  
  16.     ModuleBase& operator = (const ModuleBase&) = delete;
  17.  
  18. protected:
  19.  
  20.     template <typename T>
  21.     T& GetModule() { return std::get<T&>(m_Modules); }
  22.  
  23.     template <typename T>
  24.     const T& GetModule() const { return std::get<T&>(m_Modules); }
  25.  
  26. private:
  27.  
  28.     const std::tuple<std::add_lvalue_reference_t<Ts>...> m_Modules; // Kontener na moduły, trzyma do nich referencje
  29.  
  30. };
  31.  
  32. class ModuleX : public ModuleBase<>
  33. {
  34. public:
  35.  
  36.     using ModuleBase::ModuleBase;
  37.  
  38.     int GetX() const { return m_X; }
  39.  
  40. private:
  41.  
  42.     int m_X = 10;
  43.  
  44. };
  45.  
  46. class ModuleY : public ModuleBase<>
  47. {
  48. public:
  49.  
  50.     using ModuleBase::ModuleBase;
  51.  
  52.     float GetY() const { return m_Y; }
  53.  
  54. private:
  55.  
  56.     float m_Y = 2.5f;
  57.  
  58. };
  59.  
  60. class ModuleA : public ModuleBase<ModuleX, ModuleY> // Zależności modułu w dziedziczeniu, tj. lista wszystkich modułów z jakich nasz moduł korzysta
  61. {
  62. public:
  63.  
  64.     using ModuleBase::ModuleBase; // Używamy konstruktora klasy bazowej, tu będzie trzeba pomyśleć
  65.  
  66.     void Init() // Init modułu, ta metoda tego wymaga do poprawnego działania jeśli pobieramy coś z innego modułu
  67.     {
  68.         m_ID = GetModule<ModuleX>().GetX();
  69.         m_Number = GetModule<ModuleY>().GetY();
  70.     }
  71.  
  72.     void Print() // Testowa metoda
  73.     {
  74.         std::cout << m_ID << ' ' << m_Number << '\n';
  75.     }
  76.  
  77. private:
  78.  
  79.     int m_ID;
  80.     float m_Number;
  81.  
  82. };
  83.  
  84. template <typename... Ts>
  85. class ModulesCollection // Kontener na wszystkie moduły
  86. {
  87. public:
  88.  
  89.     ModulesCollection() :
  90.         m_Modules(((void)std::conditional_t<true, int, Ts>{}, m_Modules)...) {} // Kolejna magia, zapewne jeszcze do poprawy
  91.  
  92.     template <typename T>
  93.     T& GetModule() { return std::get<T>(m_Modules); }
  94.  
  95.     template <typename T>
  96.     const T& GetModule() const { return std::get<T>(m_Modules); }
  97.  
  98. private:
  99.  
  100.     std::tuple<Ts...> m_Modules;
  101.  
  102. };
  103.  
  104. int main()
  105. {
  106.     // Tak wygląda część silnika odpowiedzialna za moduły
  107.     ModulesCollection<
  108.         ModuleX,
  109.         ModuleY,
  110.         ModuleA
  111.     > Modules;
  112.     // Jedyne co trzeba zrobić to wpisać moduł na listę (kolejność dowolna), I TYLE ^^
  113.  
  114.     Modules.GetModule<ModuleA>().Init();
  115.     Modules.GetModule<ModuleA>().Print(); // 10 2.5
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement