使用可变参数模板创建单例模式

#ifndef BASE_SINGLETON_H
#define BASE_SINGLETON_H

#include <iostream>
#include <mutex>
#include "logger.h"
#include "base_exception.h"
#include "singleton_objects.h"

using namespace std;
namespace base {

//单例模式new出来的class 不需要手动进行释放
//进程退出时统一释放即可

    template<typename T>
    class Singleton {
    public:
        Singleton() {}

        ~Singleton() {}

        template<typename... Args>
        static T *Instance(Args &&... args) {
            if (p_instance_ == nullptr) {
                std::lock_guard<std::mutex> lock(mutex_);
                if (p_instance_ == nullptr) {

                    cout<<"开始创建单例 :"  << typeid(T).name() << endl;
                    auto p_object = new T(std::forward<Args>(args)...);

                    p_instance_ = new SingletonObject<T>(p_object);
                    SingletonObject<T>::RegistObject(p_instance_);
                }
            }

            return p_instance_->get_value();
        }

        static T *GetInstance() {
            if (p_instance_ == nullptr)
                throw Exception(-1, "the instance is not init, please initialize the instance first");
            return p_instance_->get_value();

        }

        static void DestroyInstance() {
            SingletonObject<T>::UnRegistObject(p_instance_);
            delete p_instance_;
            p_instance_ = nullptr;
        }

        Singleton(const Singleton &) = delete;

        Singleton &operator=(const Singleton &) = delete;

    private:
        static SingletonObject<T> *p_instance_;
        static std::mutex mutex_;
    };

    template<class T> SingletonObject<T> *Singleton<T>::p_instance_ = nullptr;
    template<class T> std::mutex Singleton<T>::mutex_;


    void DestroySingltonObjects();


}

#endif //BASE_SINGLETON_H
#include "singleton.h"

namespace base {

    void DestroySingltonObjects() {
        SingletonObjectBase::DestroySingletonObjects();
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值