#pragma once #include "SharedPtr.h" #include "WeakPtr.h" class EnableSharedFromThisBase { template friend class SharedPtr; template friend class EnableSharedFromThis; private: EnableSharedFromThisBase() = default; }; template class EnableSharedFromThis : public EnableSharedFromThisBase { template friend class SharedPtr; protected: SharedPtr SharedFromThis() { return __sharedFromThisWeakPtr.Lock(); } WeakPtr WeakFromThis() { return __sharedFromThisWeakPtr; } private: WeakPtr __sharedFromThisWeakPtr; template void __SetSharedFromThisWeakPtr(const SharedPtr& sharedPtr) { __sharedFromThisWeakPtr = WeakPtr(sharedPtr.GetPointer(), sharedPtr._refCount); } };