我們在寫單例模式的時候會遇到乙個問題,就是多種型別的單例可能需要建立多個型別的單例,主要是因為建立單例物件的建構函式無法統一,各種型別的形參不盡相同,導致我們不容易做乙個所有型別都通過的單例。現在c++11幫助我們解決了這個問題,解決這個問題的關鍵靠的是c++11的可變模板引數,下面看**。
template class singleton
static t* getinstance()
static void destroyinstance()
private:
singleton(void);
virtual ~singleton(void);
singleton(const singleton&);
singleton& operator = (const singleton&);
private:
static t* m_pinstance;
};template t* singleton::m_pinstance = nullptr;
上面這個單例可以解決不同型別建構函式形參不盡相同的問題,真正意義上對所有型別都通過的單利模式。
上面的例子就是來說明c++11能夠實現對所有型別都通用的單利模式,但是上面的介面中,單例物件的初始化和取值都是乙個介面,可能會遭到誤用,更新之後,將初始化和取值分為兩個介面,單例的用法是:先初始化,後面取值,如果中途銷毀單例的話,需要重新取值。如果沒有初始化就取值會丟擲乙個異常。
增加multiton的實現(多例模式)
#include #include #include using namespace std;
template < typename t, typename k = string>
class multiton
templatestatic std::shared_ptrinstance(k&& key, args&&... args)
private:
templatestatic std::shared_ptrgetinstance(key&& key, args&&...args)
else
return instance;
}private:
multiton(void);
virtual ~multiton(void);
multiton(const multiton&);
multiton& operator = (const multiton&);
private:
static map> m_map;
};template map> multiton::m_map;
C 11的單例模式
c 11中的單例模式分為懶漢模式和餓漢模式。區別 懶漢模式 延遲建立,在主動獲取物件例項的時候才去建立物件。缺點 多執行緒時需要安全處理。餓漢模式 程式初始化即建立 餓漢模式安全寫法 static singleton getinstance 或者採用call once的寫法 std once fla...
用c 11做單例模式
做個工程上能用的單例模式,不僅要支援多執行緒,也要支援多引數傳遞,也要支援餓漢和懶漢兩種模式,用了下c 11的call once,lamda表示式,可變引數模板和forward的 如下 include include using namespace std templateclass singlet...
C 11 模板的改進
在c 98 03的泛型程式設計中,模板例項化有乙個很繁瑣的地方,就是連續兩個右尖括號 會被編譯解釋成右移操作符,而不是模板參數列的形式,需要乙個空格進行分割,以避免發生編譯時的錯誤。template class x template class y int main 在例項化模板時會出現連續兩個右尖...