#ifndef SHARED_EXPIRING_POINTER_H #define SHARED_EXPIRING_POINTER_H #include namespace Shared { template class ExpiringPointer { template friend class ExpiringPointer; public: ExpiringPointer(T * rawPointer) : m_rawPointer(rawPointer) { #ifndef NDEBUG s_global = rawPointer; #endif } T * pointer() { return m_rawPointer; } T *operator->() { #ifndef NDEBUG assert(m_rawPointer != nullptr && m_rawPointer == s_global); #endif return m_rawPointer; } T &operator*() { #ifndef NDEBUG assert(m_rawPointer != nullptr && m_rawPointer == s_global); #endif return *m_rawPointer; } private: #ifndef NDEBUG static T * s_global; #endif T * m_rawPointer; }; #ifndef NDEBUG template T * ExpiringPointer::s_global = nullptr; #endif } #endif