template <typename T>
class singleton
{
public:
template<typename... Args>
static bool CreateInstance(Args&&... args)
{
if (m_pInstance == nullptr)
m_pInstance = new T(std::forward<Args>(args)...); //可变参数进行完美转发
return m_pInstance != nullptr;
}
static void DestroyInstance(void)
{
if (m_pInstance != nullptr)
{
delete m_pInstance;
m_pInstance == nullptr;
}
}
static T *Instance(void){return m_pInstance;}
private:
static T *m_pInstance;
};
template <typename T>
T *singleton<T>::m_pInstance = nullptr;
//使用方法
#include <iostream>
#include "singleton.hpp"
class Student
{
public:
Student(int boy = 0, int girl = 0);
~Student(void);
int Sum(void) { return girl_ + boy_; }
private:
int boy_;
int girl_;
};
#define sSt (*singleton<Student>::Instance())
Student::Student(int boy, int girl):
boy_(boy), girl_(girl)
{
}
Student::~Student(void)
{
}
int main()
{
if (!singleton<Student>::CreateInstance(2, 5))
{
std::cout << "create singleton student is failed" << '\n';
return -1;
}
std::cout << sSt.Sum() << '\n';
getchar();
return 0;
}
-->7
注:此单例模式只使用与单线程创建实例, 如果想在多线程中使用, 需要在CreateInstace()和DestroyInstance()加入锁