方法1:Linuxスレッドライブラリpthread_onceを使用して達成します。
noncopyable.h
#pragma once
struct noncopyable
{
protected:
noncopyable() = default;
~noncopyable() = default;
private:
noncopyable(const noncopyable&) = delete;
noncopyable& operator=(const noncopyable&) = delete;
};
#pragma once
#include "noncopyable.h"
#include <pthread.h>
template<typename T>
struct Singleton : noncopyable
{
static T& getInstace()
{
pthread_once(&poncet_, &Singleton::init);
return *data_;
}
private:
static void init()
{
data_ = new T();
}
private:
static T* data_;
static pthread_once_t poncet_;
};
template<typename T>
T* Singleton<T>::data_ = nullptr;
template<typename T>
pthread_once_t Singleton<T>::poncet_ = PTHREAD_ONCE_INIT;
方法2:内部静的ローカル変数を使用する
#pragma once
#include "noncopyable.h"
template<typename T>
struct Singleton : noncopyable
{
static T& getInstace()
{
static T data_
return data_;
}
// do somthing
};
使用する:
#include <iostream>
#include "Singleton.h"
using namespace std;
struct Test
{
Test() {}
void doIt()
{
cout << "test do it" << endl;
}
};
int main(int argc, char* argv[])
{
auto& test = Singleton<Test>::getInstace();
test.doIt();
return 0;
}