c++单例模式模板

使用c++模板递归的特性,可以将单例模式写成一个模板

//SingleTonClass.h
#pragma once

template<typename T>
class SingleTonClass {
protected:
	static T* m_instance;

public:
	static T& getInstance() {
		if (m_instance == nullptr) {
			m_instance = new T;
		}
		return *m_instance;
	}

	static void release() {
		if (m_instance != nullptr)
			delete m_instance;
		m_instance = nullptr;
	}
};
//继承方式展开模板 RS rs; 逆序释放
template<typename... T> class RS;
template<typename H, typename... T>
class RS<H, T...> : public RS<T...> {
public:
	RS() {
		static_cast<H*>(0)->release();
	}
};
template<> class RS<> {};
//递归方式展开模板 RI::release(); 顺序释放
template <typename... T> struct RI;
template <typename H, typename... T>
struct RI<H, T...>
{
	static void release() {
		static_cast<H*>(0)->release();
		RI<T...>::release();
	}
};
template<> struct RI<> { static void release() {} };

#define RRS(...) RS<__VA_ARGS__> rs
#define RRI(...) RI<__VA_ARGS__>::release()

让一个classA变成单例

//A.h
#pragma once
#include "SingleTonClass.h"

class A : public SingleTonClass<A> {
public:
}
//A.cpp
#include "A.h"

//msvc写法
A* A::m_instance = nullptr;
//gcc写法
template<>
A* SingleTonClass<A>::m_instance = nullptr;

实例化A

A::getInstance();

释放A实例、B实例、C实例

RS<A,B,C> rs;//释放顺序为C、B、A
//或
RRS(A,B,C);
//或
RI<A,B,C>::release();//释放顺序为A、B、C
//或
RRI(A,B,C);

你可能感兴趣的:(c++模板编程应用)