本人以前写过一个C++的单例模式(见此 设计模式C++之单例),想法很简单,不值一提。
最近,看了C++11的新特性中有可变参数模板,想到是否可以以此来改造单例模式。参考了网上的一些经验,写了一个大多数情况下可以通用的一个单例模式,以此记录。
template <typename T>
class SingleTon
{
public:
// 创建单例实例
template<typename... Args>
static T* instance(Args&&... args)
{
if (m_pInstance == nullptr)
{
m_pInstance = new T(std::forward<Args>(args)...);
}
return m_pInstance;
}
// 获取单例
static T* getInstance()
{
return m_pInstance;
}
// 删除单例
static void destroyInstance()
{
delete m_pInstance;
m_pInstance = nullptr;
}
private:
SingleTon();
virtual ~SingleTon();
private:
static T* m_pInstance;
};
最后,不要忘了最重要的初始化template <class T> T* SingleTon<T>::m_pInstance = nullptr;
好了,至此,新的单例模式完成。由于使用了可变参数的模板,因此这个单例在大多数场合还是适用的(经过为数不多的验证)。下面一个例子:
class SingleTest
{
public:
SingleTest(int x, double y):m_iX(x), m_dY(y){}
double sum(){ return m_iX + m_dY; }
private:
int m_iX;
double m_dY;
};
void test()
{
// 创建
SingleTon<SingleTest>::instance(1, 3.14);
// 使用(其实这里需要判断实例是否为空)
std::cout << SingleTon<SingleTest>::getInstance()->sum() << std::endl;
// 删除
SingleTon<SingleTest>::destroyInstance();
}
本文介绍了如何利用C++11的可变参数模板改进单例模式,通过这种方式创建的单例更加通用,并提供了一个简单的应用实例。

4108

被折叠的 条评论
为什么被折叠?



