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. Activity not started, its current task has been brought to the front的解决办法

    删除bin目录下所有文件,重新启动在试试

  2. Android Studio相关的坑

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  3. 移动WEB开发资源

    很多移动开发的资源 http://www.cnblogs.com/PeunZhang/p/3407453.html

  4. tomcat服务器设置用户名和密码

    conf/tomcat-user.xml <user username="admin" password="1234" roles="manag ...

  5. 优化C/C++代码的小技巧(转)

    源:http://www.cnblogs.com/lizhenghn/p/3969531.html 说明: 无意看到一篇小短文,猜测作者应该是一个图形学领域的程序员或专家,介绍了在光线(射线)追踪程序 ...

  6. C#入门经典(第五章-1)

  7. Intergate flot with Angular js ——Angular 图形报表

    下面这篇文章最终的结论就是 Flot 插件 结合 Angular 的Directive 来处理 图表的绘制 给出github上的一个demo源码.https://gist.github.com/fly ...

  8. 重点block

    //  main.m //  block探索 // //  Created by 殷婷婷 on 15-6-6. //  Copyright (c) 2015年 lanou. All rights re ...

  9. msf常用命令

    msf > search -r great -t exploits search命令查找rank为great的exploit msf > setg RHOST 192.168.1.102 ...

  10. php运行机制初探

    对于这个结果我也很吃惊,但是事实就在眼前,没办法啊,那么到底为什么会有这样的效果呢,咱们继续一探究竟: *.php(php代码) -----Scanner(zend引擎逐行扫描变为zend可以识别的语 ...