//--------------------------------------------------------------------------- /* 深いコピーをするポインタ Ver.1.1 by Gimite コピー時に「深いコピー」(指す内容のコピー)を行うスマートポインタです。 */ //--------------------------------------------------------------------------- #ifndef GIMITE_deep_ptrH #define GIMITE_deep_ptrH //--------------------------------------------------------------------------- #include //--------------------------------------------------------------------------- namespace gimite{ //--------------------------------------------------------------------------- template struct default_cloner: std::unary_function { T* operator()(const T* src){return new T(*src);} }; template > class deep_ptr { public: typedef T value_type; typedef Cloner cloner_type; explicit deep_ptr(T* p= 0): p_(p){} deep_ptr(const deep_ptr& src): p_(src.p_? Cloner()(src.p_):0){} ~deep_ptr(){delete p_;} deep_ptr& operator=(const deep_ptr& src){ if (&src!=this){ delete p_; p_= src.p_? Cloner()(src.p_):0; } return *this; } T* get(){return p_;} const T* get()const{return p_;} void reset(T* p){ delete p_; p_= p; } T& operator*(){return *p_;} const T& operator*()const{return *p_;} T* operator->(){return p_;} const T* operator->()const{return p_;} private: T* p_; }; //--------------------------------------------------------------------------- }//namespace gimite //--------------------------------------------------------------------------- #endif