个人感觉如果没有特殊需求的话还是不用继承的方式直接写在一个类里就好,比如:
class A {
public:
static A* GetInstance() {
static A a;
return &a;
private:
A() = default;
C++11之后
static
的局部变量直接保证是线程安全的,初始化只被执行一次,想在构造函数里加什么参数直接加就好了
如果一定要用一个基类表示的话,考虑到构造函数的参数列表是不定的,保证线程安全的前提下一个比较简单的方法应该就是
@猪蹄酱
提到的
std::call_once
保证只初始化一次。试着按照这个思路写了个代码(第一次写这种模板代码,如有错误或更简化的方法欢迎指正)
template <class T>
class Singleton {
public:
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&&) = delete;
template <typename... Args>
static T* GetInstance(Args&&... args) {
std::call_once(init_flag_, Initialize<Args...>,
std::forward<Args>(args)...);
return instance_;
protected:
Singleton() = default;
~Singleton() = default;
private:
template <typename... Args>
static void Initialize(Args&&... args) {
if (instance_ != nullptr) {
return;
instance_ = new T(std::forward<Args>(args)...);
std::atexit(Destroy);
static void Destroy() { delete instance_; }
static T* instance_;
static std::once_flag init_flag_;