用c 11做單例模式

2021-08-21 06:56:45 字數 1140 閱讀 9992

做個工程上能用的單例模式,不僅要支援多執行緒,也要支援多引數傳遞,也要支援餓漢和懶漢兩種模式,用了下c++11的call_once, lamda表示式,可變引數模板和forward的**,**如下:

#include #include using namespace std;

templateclass singleton

static t* get()

);         return ins;

} static void destroy()

private:

singleton();

virtual ~singleton();

singleton(const singleton& s);

singleton& operator=(const singleton& s);

static t* ins;

};templatet* singleton::ins=null;

其中init和get分離的是餓漢模式,在多執行緒程式中,潛在出現競爭的是new的地方,將init放到乙個安全的地方,比如主程序的初始化部分,可以避免競爭。

getandinit是典型的懶漢模式,即在get的時候檢查初始化,傳統的處理方法是double check+記憶體柵欄,不過既然c++11提供了call_once這麼適合單例的操作,不用就可惜了,call_once的實際工作用的是lamda表示式。

template比傳統的template多了3個點,實現了可變引數模板,forward直接把可變的引數完美**了。

singleton的private部分是為了禁止構造,析構,拷貝構造和賦值,多說一句virtual修飾析構,是為了呼叫派生類和基類的析構函式,應對了動態繫結,預防了記憶體洩漏。

在函式外的ins賦值為null的部分,完成對ins的定義,這裡需要在template之後明確的指定型別為t*。

附乙個測試例子,注釋掉的部分是測試餓漢的部分。

struct a

編譯的方法是:

g++ test.cc -o test -std=c++11 -pthread
注意用到了call_once這個函式,所以編譯的時候需要pthread。

C 11改進單例模式

我們在寫單例模式的時候會遇到乙個問題,就是多種型別的單例可能需要建立多個型別的單例,主要是因為建立單例物件的建構函式無法統一,各種型別的形參不盡相同,導致我們不容易做乙個所有型別都通過的單例。現在c 11幫助我們解決了這個問題,解決這個問題的關鍵靠的是c 11的可變模板引數,下面看 template...

C 11的單例模式

c 11中的單例模式分為懶漢模式和餓漢模式。區別 懶漢模式 延遲建立,在主動獲取物件例項的時候才去建立物件。缺點 多執行緒時需要安全處理。餓漢模式 程式初始化即建立 餓漢模式安全寫法 static singleton getinstance 或者採用call once的寫法 std once fla...

使用C 11的可變引數模板改造單例模式

本人以前寫過乙個c 的單例模式 見此 設計模式c 之單例 想法很簡單,不值一提。最近,看了c 11的新特性中有可變引數模板,想到是否可以以此來改造單例模式。參考了網上的一些經驗,寫了乙個大多數情況下可以通用的乙個單例模式,以此記錄。template t class singleton return ...