C++自用小轮子——单例模板

paw5zx Lv4

简介

记录开发时自用的小轮子:单例模板。

单例模板

提供了一个基于模板的单例模式的实现,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef SINGLETON_H
#define SINGLETON_H

template <typename T>
class CSingleton
{
public:
static T& GetInstance()
{
static T instance;
return instance;
}
protected:
CSingleton() {}

~CSingleton() {}
CSingleton(const CSingleton&) = delete;
CSingleton& operator=(const CSingleton&) = delete;
};

#endif // SINGLETON_H

使用方法

使用了奇异递归模板模式(Curiously Recurring Template Pattern, CRTP)。子类将自己作为模板参数传递给单例模板进行模板实例化,用做基类;同时在子类内部将基类声明为友元,这样才能在通过CSingleton::getInstance()方法创建CLogManager唯一实例时,调用到CLogManager的私有的构造函数。
如此操作就可以使业务类(以CLogManager为例)具有单例属性,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class CLogManager final : public CSingleton<CLogManager>
{
friend class CSingleton<CLogManager>;
public:
...
private:
CLogManager();
~CLogManager();
};

#endif // CLOGMANAGER_H

int main()
{
CLogManager& p_log_instance = CLogManager::GetInstance();
...
}
  • 标题: C++自用小轮子——单例模板
  • 作者: paw5zx
  • 创建于 : 2024-04-03 15:10:33
  • 更新于 : 2024-08-20 11:24:40
  • 链接: https://paw5zx.github.io/cpp-development-components-singleton-CRTP/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
C++自用小轮子——单例模板