template_singleton.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #ifndef TEMPLATE_SINGLETON_H
  2. #define TEMPLATE_SINGLETON_H
  3. #include <mutex>
  4. // 定义单例(声明友元)
  5. #define SINGLETON_DEFINE(Class, ...) \
  6. friend TemplateSingleton<Class, ##__VA_ARGS__>;
  7. // 创建单例(不存在创建,存在获取本类唯一单例)
  8. #define SINGLETON_CREATE(Class, ...) \
  9. TemplateSingleton<Class, ##__VA_ARGS__>::CreateInstance
  10. // 销毁单例
  11. #define SINGLETON_DELETE(Class, ...) \
  12. TemplateSingleton<Class, ##__VA_ARGS__>::DeleteInstance
  13. template <typename Class, typename ...Args>
  14. class TemplateSingleton
  15. {
  16. public:
  17. static Class* CreateInstance(Args ...args);
  18. static void DeleteInstance();
  19. private:
  20. static Class* s_pObject;
  21. static std::mutex s_mutex;
  22. };
  23. template <typename Class, typename ...Args>
  24. Class* TemplateSingleton<Class, Args...>::CreateInstance(Args ...args)
  25. {
  26. if (s_pObject == nullptr)
  27. {
  28. std::lock_guard<std::mutex> unique(s_mutex);
  29. if (s_pObject == nullptr)
  30. {
  31. s_pObject = new Class(args...);
  32. }
  33. }
  34. return s_pObject;
  35. }
  36. template <typename Class, typename ...Args>
  37. void TemplateSingleton<Class, Args...>::DeleteInstance()
  38. {
  39. if (s_pObject != nullptr)
  40. {
  41. std::lock_guard<std::mutex> unique(s_mutex);
  42. if (s_pObject != nullptr)
  43. {
  44. delete s_pObject;
  45. s_pObject = nullptr;
  46. }
  47. }
  48. }
  49. template <typename Class, typename ...Args>
  50. Class* TemplateSingleton<Class, Args...>::s_pObject = nullptr;
  51. template <typename Class, typename ...Args>
  52. std::mutex TemplateSingleton<Class, Args...>::s_mutex;
  53. #endif //TEMPLATE_SINGLETON_H