boost的单例模式
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的代码还是很好玩的,能学到不少模版的技巧,模版的奇淫巧技不一定会用,但至少得能看懂,毕竟很多开源库都有模版的实现。