C++单例模式实现(线程安全&支持多参数构造)
C++单例模式实现(线程安全&支持多参数构造)
线程安全版本
#include <>template class ThreadSafeSingleton {
public:
static T& get() {
std::call_once(ThreadSafeSingleton::create_once_, &ThreadSafeSingleton::Create);
return *ThreadSafeSingleton::instance_;
}
protected:
static void Create() { instance_ = new T();
}
static std::once_flag create_once_;
static T* instance_;
};
template std::once_flag ThreadSafeSingleton::create_once_;
template T* ThreadSafeSingleton::instance_ = nullptr;
支持多参数版本的单例类
#include
#include
#include template
class ThreadSafeSingleton {public:
template
static T& Getinstance(Args&&... args) {
std::call_once(ThreadSafeSingleton::_call_once_flag,
std::forward(&ThreadSafeSingleton::init),
std::forward(args)...);
return *ThreadSafeSingleton::m_instance;
}private:
ThreadSafeSingleton() = default;
~ThreadSafeSingleton() {
delete ThreadSafeSingleton::m_instance;
ThreadSafeSingleton::m_instance = nullptr;
}
ThreadSafeSingleton(const ThreadSafeSingleton& o) = delete;
ThreadSafeSingleton& operator=(const ThreadSafeSingleton& o) = delete;
template
static void init(Args&&...args) {
m_instance =new T(std::forward(args)...);
}private:
static std::once_flag _call_once_flag;
static T* m_instance;
};
template T* ThreadSafeSingleton::m_instance = nullptr;
template std::once_flag ThreadSafeSingleton::_call_once_flag;
遇到问题点:
- std::call_once中模板传参时候需要注意点: 第二个参数为函数参数
- std::forward<函数类型>(具体值)
最后调用:
std::call_once(ThreadSafeSingleton::_call_once_flag,?std::forward(&ThreadSafeSingleton::init),?std::forward(args)...);
测试代码:
class TestSingleton1 {
public:
TestSingleton1(const std::string&){ std::cout << "lvalue" << std::endl;
}
TestSingleton1(std::string&&){ std::cout << "rvalue" << std::endl;
}
~TestSingleton1() = default;
void testFunc() {
std::cout << "test function 1" << "\n";
}
};
class TestSingleton2 {
public:
TestSingleton2(const std::string&){ std::cout << "lvalue" << std::endl;
}
TestSingleton2(std::string&&){ std::cout << "rvalue" << std::endl;
}
~TestSingleton2() = default;
void testFunc() {
std::cout << "test function 2" << "\n";
}
};
class TestSingleton3 {
public:
TestSingleton3(const std::string&,int i,double k){ std::cout << "lvalue" << std::endl;
}
~TestSingleton3() = default;
void testFunc() {
std::cout << "test function 3" << "\n";
}
};
int main(int argc, char **argv) {
std::string str = "bb";
ThreadSafeSingleton::Getinstance(str).testFunc();
ThreadSafeSingleton::Getinstance(std::move(std::string("xxxx"))).testFunc();
ThreadSafeSingleton::Getinstance("yyyy",1,2.0).testFunc();
return 0
}
本文代码参考
《深入应用C++11》
本文由博客群发一文多发等运营工具平台 OpenWrite 发布
推荐阅读
- opencv|opencv C++模板匹配的简单实现
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 设计模式-代理模式-Proxy
- c++基础概念笔记
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- java静态代理模式
- VueX(Vuex|VueX(Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式)
- Kotlin基础(10)-代理模式在kotlin中的使用
- 长谈的确是这个时代需要的一种模式