C++11可变参数模板单例模式

单例模式

该示例代码采用C11标准,解决以下问题:

  1. 通过类模板函数实现不同类型单例;
  2. 单例类构造函数支持不同的个数;
  3. 消除代码重复

示例代码

.h文件如下:

cpp 复制代码
//C++11Singleton.h文件
#pragma once

template <typename T>
class Singleton
{
public:
	template<typename... Args>
	static T* Instance(Args&&... args)
	{
		if (m_pInstance == nullptr)
		{
			m_pInstance = new T(std::forward<Args>(args)...);
		}
		return m_pInstance;
	}

	static T* GetInstance()
	{
		if (m_pInstance == nullptr)
		{
			throw std::logic_error("the instance is not init,please initialize the instance first");
		}
		return m_pInstance;
	}

	static void DestorInstance()
	{
		delete m_pInstance;
		m_pInstance = nullptr;
	}

private:
	Singleton();
	virtual ~Singleton();
	Singleton(const Singleton&);
	Singleton& operator = (const Singleton&);
private:
	static T* m_pInstance;
};

.cpp文件如下:

cpp 复制代码
#include <iostream>
#include "C++11Singleton.h"
using namespace std;

template <class T> T* Singleton<T>::m_pInstance = nullptr;

struct A
{
    A(const string&) { cout << "lvalue" << endl; };
    A(string&& x) { cout << "rvalue" << endl; };
};

struct B
{
    B(const string&) { cout << "lvalue" << endl; };
    B(string&& x) { cout << "rvalue" << endl; };
};

struct C
{
    C(int x, double y) {};
    void Fun() { cout << "test" << endl; };
};

int main()
{
    string str = "bb";
    Singleton<A>::Instance(str);

    Singleton<B>::Instance(std::move(str));

    Singleton<C>::Instance(1,3.14);
    Singleton<C>::GetInstance()->Fun();

    Singleton<A>::DestorInstance();
    Singleton<B>::DestorInstance();
    Singleton<C>::DestorInstance();
   
    cin.get();
    return 0;
}

输出结果如下:

以上只是个示例,该单例非模式还不支持多线程调用。

相关推荐
WYH287几秒前
为什么在cubeide里勾选了can1,生成的工程里没有can.c?
c语言·开发语言
3 分钟前
java关于键盘录入
java·开发语言
马猴烧酒.5 分钟前
JAVA后端对象存储( 图片分享平台)详解
java·开发语言·spring·腾讯云
wearegogog12315 分钟前
基于MATLAB的D2D仿真场景实现
开发语言·网络·matlab
froginwe1117 分钟前
Chart.js 散点图详解
开发语言
独自破碎E19 分钟前
【纵向扫描】最长公共前缀
java·开发语言
nuo53420225 分钟前
C语言实现类似面向对象的三大特性
c语言·开发语言
321.。28 分钟前
深入理解 Linux 线程封装:从 pthread 到 C++ 面向对象实现
linux·开发语言·c++
EmbedLinX31 分钟前
Linux内核之文件系统:从VFS到实际存储的运作机制
linux·服务器·c语言·c++
zfoo-framework33 分钟前
kotlin
android·开发语言·kotlin