#ifndef WEAK_PTR_HH #define WEAK_PTR_HH #include template class WeakPtr { public: explicit WeakPtr(T* ptr) : ptr_(ptr) {} void unlink() { ptr_ = nullptr; } T* get() { return ptr_; } private: T* ptr_; }; template class WeakPtrOwner { public: explicit WeakPtrOwner(T* ptr) : ptr_(std::make_shared>(ptr)) {} ~WeakPtrOwner() { ptr_->unlink(); } std::shared_ptr> get() { return ptr_; } private: std::shared_ptr> ptr_; }; #endif // WEAK_PTR_HH