C++ CRTP 是个很有意思的东西,因为解释原理的文章很多,但是讲怎么用的就不是很多了。

今天就稍微写下CRTP(奇异递归模板模式)的一个有趣的用法:Singleton(单例模式)

单例有很多中写法,最常见的就是直接写(笑),不过今天就不介绍直接写的写法了,下面是用模版的方式来写,不过有别于其他的模版实现方式,采用的是CRTP:

     template<class ActualClass>
class Singleton
{
public:
static ActualClass* GetInstance()
{
if (m_p == nullptr)
m_p = new ActualClass;
return m_p;
}
static void ReleaseInstatnce()
{
if (m_p != nullptr)
delete m_p;
} protected:
Singleton() {}
~Singleton() {} private:
Singleton(Singleton const &);
Singleton& operator = (Singleton const &);
static ActualClass *m_p;
}; template<typename T>
T* Singleton<T>::m_p = nullptr; class SingletonClass : public Singleton<SingletonClass>
{
friend Singleton<SingletonClass>;
SingletonClass() {};
~SingletonClass() {};
};

然后用的时候就可以:SingletonClass *p = SingletonClass::GetInstance();

你还可以在SingletonClass 自己定义对应的数据类型,如果强迫症发作还接着可以将SingletonClass 模版化变成 typedef SingletonClass<T> SingletonDefine;的形式

上面的代码还不是线程安全的形式,如果想要线程安全的形式,那么如下:

 1     template<class ActualClass>
class Singleton
{
public:
static ActualClass* GetInstance()
{
static ActualClass ActualClassDefine;
return &ActualClassDefine;
} protected:
Singleton() {}
~Singleton() {} private:
Singleton(Singleton const &);
Singleton& operator = (Singleton const &);
}; class SingletonClass : public Singleton<SingletonClass>
{
friend Singleton<SingletonClass>;
SingletonClass() {};
~SingletonClass() {};
};

采用的是effect C++ 中作者给出的建议,这个方法在C++11以上都是用了锁保证了初始化的唯一性

其实CRTP还有一个最重要的功能就是编译期的“多态”,这个就暂时不讲了,下次和模版的traits一起说下

												

C++ CRTP singleton的更多相关文章

  1. 面试中的Singleton

      引子 “请写一个Singleton.”面试官微笑着和我说. “这可真简单.”我心里想着,并在白板上写下了下面的Singleton实现: 1 class Singleton 2 { 3 public ...

  2. 当noncopyable遇见singleton

    在实现单例类时,通常要把构造相关的几个函数访问权限设为private或protected(最好是private).但假设一个大型系统中,有数十个单例类(这很正常,单例类其实是外观模式的一种最常用设计) ...

  3. C++面试中的singleton类

    引子 “请写一个Singleton.”面试官微笑着和我说. “这可真简单.”我心里想着,并在白板上写下了下面的Singleton实现: 1 class Singleton 2 { 3 public: ...

  4. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  5. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

  6. PHP设计模式(四)单例模式(Singleton For PHP)

    今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...

  7. The Java Enum: A Singleton Pattern [reproduced]

    The singleton pattern restricts the instantiation of a class to one object. In Java, to enforce this ...

  8. 最适合作为Java基础面试题之Singleton模式

    看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...

  9. 每天一个设计模式-4 单例模式(Singleton)

    每天一个设计模式-4 单例模式(Singleton) 1.实际生活的例子 有一天,你的自行车的某个螺丝钉松了,修车铺离你家比较远,而附近的五金店有卖扳手:因此,你决定去五金店买一个扳手,自己把螺丝钉固 ...

随机推荐

  1. HDU 2671 Can't be easier

    简单的几何题目 点(a,b)关于直线Ax+By+C=1对称点的公式 #include<cstdio> #include<cstring> #include<cmath&g ...

  2. ZEN_CART_如何添加自定义页面

    按照下面的路径,添加自己的文件,就OK了 以about us页面为例, 默认模板 \includes\templates\template_default\templates\tpl_about_us ...

  3. HDU 3726 Graph and Queries 平衡树+前向星+并查集+离线操作+逆向思维 数据结构大综合题

    Graph and Queries Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. JavaScript基础教程

    功能介绍: (1)数据验证 弹出提示的对话框,产生判断的效果. (2)气泡提示窗口 右下角等等一类的窗口 (3)产生新窗口 (4)无边框窗口背景变灰,也是可以节约系统资源的

  5. CABasicAnimation 基础

    一.CABasicAnimation CAPropertyAnimation的子类 属性解析: fromValue:keyPath相应属性的初始值 toValue:keyPath相应属性的结束值 随着 ...

  6. 认识ExtJS(04)--常见Web框架的ExtJS改造

    常见Web框架的ExtJS改造 怎样开始改造工作? 改造主要集中在对表现层的修改,底层的数据库访问不需要进行任何的变动.也就是说主要集中早这2个方面:一方面是表现部分即是JSP页面:另一方面是客户端与 ...

  7. BodyContent揭秘及定制复杂的JSP标签

    BodyContent揭秘及定制复杂的JSP标签 标签: jspintegerwrapperclass设计模式 2010-08-30 11:30 4555人阅读 评论(0) 收藏 举报  分类: HT ...

  8. Nginx配置文件常用部分详解

    原文 #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes ; #全局错误日志定义类型,[ debug ...

  9. PL\SQL学习笔记

    注释 单行--多行 一.declare一般用于做变量的申明.begin 程序体开始执行  end; 程序体结束exception .. dbms_output.put_line('绝对值'||v_ab ...

  10. Android apk反编译基础(apktoos)图文教程

    本文主要介绍了Android apk反编译基础,使用的工具是apktoos,我们将用图文的方式说明apktoos工具的使用方式,你可以参考这个方法反编译其它APK试试看了 很久有写过一个广工图书馆主页 ...