template <typename T>
struct singleton_default
{
private:
struct object_creator
{
object_creator() { singleton_default<T>::instance(); }
inline void do_nothing() const { }
};
static object_creator create_object;
singleton_default();
public:
typedef T object_type;
static object_type & instance()
{
static object_type obj;
create_object.do_nothing();
return obj;
}
};
template <typename T>
typename singleton_default<T>::object_creator
singleton_default<T>::create_object;
boost的單例模版是一個線程安全的版本,單例的初始化被確保在main函數以前進行
1.create_object是static成員變量,所以create_object會在main函數以前完成初始化
2.create_object是static的成員變量,給出一個通用的聲明
3.create_object的構造函數包含了singleton_default<T>::instance()
4.singleton_default<T>::instance()包含一個T類型的靜態成員,若是singleton_default<T>::instance()被調用,obj將被靜態的構造
5.模版具備延遲實現機制,只是聲明create_object而不調用create_object的方法是不會真正實例化的,因此有了create_object.do_nothing(),確保create_object被實例化
研究一下boost的代碼仍是很好玩的,能學到很多模版的技巧,模版的奇淫巧技不必定會用,但至少得能看懂,畢竟不少開源庫都有模版的實現。