fork download
  1. #include <iostream>
  2. #include <map>
  3. #include <typeinfo>
  4. #include <typeindex>
  5. #include <string>
  6.  
  7. class Base {
  8. public:
  9. virtual ~Base() {}
  10. };
  11.  
  12. class Manager
  13. {
  14. private:
  15. static std::map<std::type_index, Base*> m_instances;
  16.  
  17. public:
  18. template<typename T>
  19. static void addInstance(Base *inst) {
  20. m_instances[std::type_index(typeid(T))] = inst;
  21. }
  22.  
  23. template<typename T>
  24. static void removeInstance() {
  25. auto iter = m_instances.find(std::type_index(typeid(T)));
  26. if (iter != m_instances.end())
  27. m_instances.erase(iter);
  28. }
  29.  
  30. template<typename T>
  31. static T* getInstance() {
  32. auto iter = m_instances.find(std::type_index(typeid(T)));
  33. if (iter != m_instances.end())
  34. return static_cast<T*>(iter->second);
  35. return nullptr;
  36. }
  37. };
  38.  
  39. template<class Derived>
  40. class A : public Base
  41. {
  42. public:
  43. A() {
  44. Manager::addInstance<Derived>(this);
  45. }
  46.  
  47. ~A() {
  48. Manager::removeInstance<Derived>();
  49. }
  50.  
  51. static Derived* getInstance() {
  52. return Manager::getInstance<Derived>();
  53. }
  54. };
  55.  
  56. class B : public A<B>
  57. {
  58. public:
  59. std::string name = "B";
  60. };
  61.  
  62. class C : public A<C>
  63. {
  64. public:
  65. std::string name = "C";
  66. };
  67.  
  68. std::map<std::type_index, Base*> Manager::m_instances;
  69.  
  70. B b_inst;
  71. C c_inst;
  72.  
  73. int main(void) {
  74. B *pB = B::getInstance();
  75. if (pB) std::cout << pB->name << std::endl;
  76. C *pC = C::getInstance();
  77. if (pC) std::cout << pC->name << std::endl;
  78. return 0;
  79. }
Success #stdin #stdout 0s 4472KB
stdin
Standard input is empty
stdout
B
C