zoukankan      html  css  js  c++  java
  • 单例模式模板

    在平常的开发工作中,单例是我们经常使用的模式,经常我们需要写无数个单例类,现在提供一种单例模板:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #pragma once
     
    // common include
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>  
    // windows include 
    #if defined _WIN32
    #else
    // linux include
    #include <errno.h>
    #endif
         
    template <typename T>
    class Singleton
    {
    protected:
        static T* singleton_;
    public:
        Singleton(void)
        {
            assert(!singleton_);
    #if defined(_MSC_VER) && _MSC_VER < 1200 
            int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
            singleton_ = (T*)((int)this + offset);
    #else
            singleton_ = static_cast< T* >(this);
    #endif
        }
         
         
        ~Singleton(void){  assert(singleton_);  singleton_ = 0; }
        static T& getSingleton(void) { assert(singleton_);  return (*singleton_); }
        static T* getSingletonPtr(void){ return singleton_; }
    };
     
    #define _SINGLETON_INIT( TYPE )                
    template <>    TYPE * Singleton< TYPE >::singleton_ = 0;   

    用法: 
    class A:public Singleton<A> 

    }; 
    在cpp文件中:

    template<> A* Singleton<A>::singleton_ = 0;

    _SINGLETON_INIT(A)

  • 相关阅读:
    php
    php
    linux 网络管理基础 OSI ISO IOS的区别
    Linux 添加交换分区的步骤
    linux 命令
    linux命令
    linux 命令
    linux 命令
    Linux命令
    linux命令- 挂载命令 mount
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/5132341.html
Copyright © 2011-2022 走看看