// 单例模式:任意类型,任意参数的的单例
//线程安全,c++11保证了static变量是线程安全的
//优点:支持任意参数的类型;支持完美转发
template <typename T>
class Single
{
public:
template<typename ...Arg>
static T* Insatnce(Arg&&... arg)
{
if (m_instance == nullptr)
m_instance = new T(std::forward<Arg>(arg)...);
return m_instance;
}
static T* getInstance()
{
if (m_instance == nullptr)
throw std::logic_error("not init");
return m_instance;
}
static void Destory()
{
if (m_instance != nullptr)
delete m_instance;
m_instance = nullptr;
}
private:
Single() = default;
~Single() {}
Single&operator=(const Single&rv) = delete;
Single(const Single&rv) = delete;
private:
static T * m_instance;//静态成员必须初始化
};
template<typename T>
T*Single<T>::m_instance = nullptr;
//测试代码
class Heart
{
public:
Heart(int a, string c) :weight(a), color(c){}
int weight;
string color;
};
class Stu
{
public:
Stu(string n, int a, string g, double sc) :nama(n), age(a), gender(g), score(sc) {}
string nama;
int age;
string gender;
double score;
};
struct A
{
A(const string&) { cout << "lv" << endl; }
A(string &&) { cout << "rv" << endl; }
};
int main()
{
string sr = "yang";
Single<A>::Insatnce("yang");
auto satu = Single<A>::getInstance();
Single<Stu>::Insatnce("yang", 23, "men", 100);
auto stu = Single<Stu>::getInstance();
Single<Heart>::Insatnce(23, "red");
auto heart = Single<Heart>::getInstance();
}