c++11 singleton 类模板实现

使用单利从来没有如此容易和省心过,支持二段式构造,直接贴代码

#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include "simple_ptr.h"
#include <functional>
#if defined(_ENABLE_MULTITHREAD)
#include <mutex>
#endif

namespace purelib {
namespace gc {

    /// CLASS TEMPLATE singleton, support delay init with variadic args
    template<typename _Ty>
    class singleton
    {
    public:
        template<typename ..._Args>
        static _Ty* instance(_Args...args)
        {
            if (nullptr == singleton<_Ty>::__single__.get())
            {
#if defined(_ENABLE_MULTITHREAD)
                singleton<_Ty>::__mutex__.lock();
#endif
                if (nullptr == singleton<_Ty>::__single__.get())
                {
                    singleton<_Ty>::__single__.reset(new _Ty);
                    delay_init(args...);
                }
#if defined(_ENABLE_MULTITHREAD)
                singleton<_Ty>::__mutex__.unlock();
#endif
            }
            return singleton<_Ty>::__single__.get();
        }

        static void destroy(void)
        {
            if (singleton<_Ty>::__single__.get() != nullptr)
            {
                singleton<_Ty>::__single__.reset();
            }
        }

    private:

        template<typename _Fty, typename...Args>
        static void delay_init(const _Fty& memf, Args...args)
        { // init use specific member func with more than 1 args
            std::mem_fn(memf)(singleton<_Ty>::__single__.get(), args...);
        }

        template<typename _Fty, typename Arg>
        static void delay_init(const _Fty& memf, const Arg& arg)
        { // init use specific member func with 1 arg
            std::mem_fun(memf)(singleton<_Ty>::__single__.get(), arg);
        }

        template<typename _Fty>
        static void delay_init(const _Fty& memf)
        { // init use specific member func no args
            std::mem_fun(memf)(singleton<_Ty>::__single__.get());
        }

        static void delay_init(void)
        { // no init
        }

    private:
        static simple_ptr<_Ty> __single__;
#if defined(_ENABLE_MULTITHREAD)
        static std::mutex    __mutex__;
#endif
    };

    template<typename _Ty>
    simple_ptr<_Ty> singleton<_Ty>::__single__;
#if defined(_ENABLE_MULTITHREAD)
    template<typename _Ty>
    std::mutex    singleton<_Ty>::__mutex__;
#endif
};

};

#endif

/*
* Copyright (c) 2012-2014 by X.D. Guo  ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
V3.0:2011 */
时间: 2024-10-15 02:24:30

c++11 singleton 类模板实现的相关文章

类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

 1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPushButton> #include <QLabel> template<class T> class run { public: T w; void show() { w.show(); } void settext() { w.setText("A"); }

【C/C++学院】(11)泛型编程/函数模板/类模板

1.泛型编程基础 #include "iostream" using namespace std; void swap(int &a, int &b) { int c; c = a; a = b; b = c; } void swap(float &a, float &b) { float c; c = a; a = b; b = c; } void main() { int a = 1, b = 2; swap(a, b); float a1 = 1,

C++面试中的singleton类

引子 “请写一个Singleton.”面试官微笑着和我说. “这可真简单.”我心里想着,并在白板上写下了下面的Singleton实现: 1 class Singleton 2 { 3 public: 4 static Singleton& Instance() 5 { 6 static Singleton singleton; 7 return singleton; 8 } 9 10 private: 11 Singleton() { }; 12 }; “那请你讲解一下该实现的各组成.”面试官的

C++可继承的单例基类模板

目录 一.介绍 二.代码 三.关键处 四.使用限制 五.参考资料 一.介绍 最近在写一个项目,其中用到好几个单例,类本身的设计不是很复杂,但是如果每个都写一遍单例又觉得有点冗余:所以查资料写了一个单例基类模板,只要一个类继承这个基类并且以自身作为模板参数就可以实现一个单例:关于单例本身的介绍在这里不重点介绍. 特点: RAII,使用 std::shared_ptr来管理资源 线程安全,加了锁 以上特性基于C++11 二.代码 // bridf: a singleton base class of

c++类模板之间友元函数调用

1 #include <stdio.h> 2 #include <iostream> 3 4 using namespace std; 5 6 template<typename T> class BTree; 7 8 /***************************节点类模板*********************************/ 9 template<typename T> 10 class BTreeNode{ 11 friend

类模板

与函数模板不同的是,编译器不能为类模板推断模板参数的类型,为了使用类模板,我们必须在模板名后的尖括号中提供额外的消息---用来代替模板参数的模板实参列表.这些额外的信息是显式的模板实参列表,它们被绑定到模板参数. #include<iostream> using namespace std; template <typename T> class Parent { public: Parent(T a) { this->a = a; } virtual void printf

C++模板学习:函数模板、结构体模板、类模板

C++模板:函数.结构体.类 模板实现 1.前言:(知道有模板这回事的童鞋请忽视) 普通函数.函数重载.模板函数 认识. //学过c的童鞋们一定都写过函数sum吧,当时是这样写的: int sum(int a,int b) { return a+b; } //实现了整数的相加 //如果再想同时实现小数的相加,就再多写个小数的相加.普通实现我就不写了,知道函数重载的童鞋们会这样写: int sum(int a,int b) {//第一个function return a+b;} double su

C++提高1 【泛型编程】函数模板 类模板

[本文谢绝转载] [泛型编程] 函数模板 为什么会有函数模板 现象: 函数的业务逻辑一样 函数的参数类型不一样 [最常用]函数模板  显式的调用 [不常用]类型推导 多个参数,参数定义了必须要用 函数模板,实现int类型数组,char字符串排序: 函数模板 与 普通函数的本质区别 函数模板 和 普通函数在一起 的调用型研究: C++是如何支持函数模板机制的? 函数模板机制结论 类模板 类模板的定义 类模板做函数的参数 类模板的派生成普通类 模板类的派生成模板类 复数类,所有函数都写在类的内部,运

C++程序设计_第7章_类模板与向量

例7.1 使用类模板的实例. 例7.2 求4个数中最大值的类模板程序. 1 #include <iostream> 2 3 using namespace std; 4 5 template <class T> 6 7 class Max4 8 { 9 T a, b, c, d; 10 T Max(T a, T b) 11 { 12 return (a > b) ? a : b; 13 } 14 public: 15 Max4(T, T, T, T); 16 T Max(vo