#pragma once #include #include #include namespace dp { template class singleton : public boost::noncopyable { protected: static std::shared_ptr instance_; static std::mutex mutex_for_singleton_; singleton() {} class T_ctor : public T { public: T_ctor() : T() {} }; public: virtual ~singleton() {} static std::shared_ptr get_instance() { std::lock_guard lock(mutex_for_singleton_); if (!instance_) { instance_ = std::make_shared(); } return instance_; } static T& get_object() { return *get_instance(); } static void release_singleton() { instance_ = nullptr; } static bool is_instance_exists() { return instance_ != nullptr; } }; template std::mutex singleton::mutex_for_singleton_; template std::shared_ptr singleton::instance_ = nullptr; }