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;
}

输出结果如下:

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

相关推荐
学习编程的Kitty16 小时前
JavaEE初阶——多线程(4)线程安全
java·开发语言·jvm
刚子编程16 小时前
ASP.NET Core Blazor 核心功能一:Blazor依赖注入与状态管理指南
开发语言·.netcore·blazor
海木漄16 小时前
C# 内存是绝对自动清理吗?
开发语言·c#
野老杂谈16 小时前
如何快速学习智能合约开发语言 Solidity
开发语言·学习·智能合约·solidity·以太坊·区块链开发
Han.miracle17 小时前
Java线程的学习—多线程(一)
java·开发语言·学习
应用市场17 小时前
PHP microtime()函数精度问题深度解析与解决方案
android·开发语言·php
北邮-吴怀玉17 小时前
6.3.3.1 大数据方法论与实践指南-大数据质量度量指标体系
大数据·单例模式
长存祈月心17 小时前
Rust HashSet 与 BTreeSet深度剖析
开发语言·后端·rust
长存祈月心17 小时前
Rust BTreeMap 红黑树
开发语言·后端·rust
好奇的候选人面向对象17 小时前
基于 Element Plus 的 TableColumnGroup 组件使用说明
开发语言·前端·javascript