template<typename T>
class TemPlateSingleton
{
private:
explicit TemPlateSingleton() =default;
~TemPlateSingleton() = default;
explicit TemPlateSingleton(const TemPlateSingleton& tem) = delete;
TemPlateSingleton& operator = (const TemPlateSingleton& tem) = delete;
explicit TemPlateSingleton(TemPlateSingleton&& tem) = delete;
TemPlateSingleton& operator = (TemPlateSingleton&& tem) = delete;
public:
static T* GetInstance();
static T* GetAtomicInstance();
private:
static T* m_pTemplate;
static std::mutex m_templateMutex;
};
template<typename T>
T* TemPlateSingleton<T>::m_pTemplate = nullptr;
template<typename T>
std::mutex TemPlateSingleton<T>::m_templateMutex;
template<typename T>
T* TemPlateSingleton<T>::GetInstance()
{
std::lock_guard<std::mutex> locker(m_templateMutex);
if (m_pTemplate == nullptr)
{
m_pTemplate = new T();
}
return m_pTemplate;
}