ManagedInstance.h pma/PolyAllocator.h functional memory utility pma::impl::ManagedInstance pma pma::impl //CopyrightEpicGames,Inc.AllRightsReserved. #pragmaonce #include"pma/PolyAllocator.h" #ifdef_MSC_VER #pragmawarning(push) #pragmawarning(disable:43654987) #endif #include<functional> #include<memory> #include<utility> #ifdef_MSC_VER #pragmawarning(pop) #endif namespacepma{ classMemoryResource; namespaceimpl{ template<classTPointer,classTTarget,classTBase=TTarget> classManagedInstance{ public: usingPointerType=TPointer; private: explicitManagedInstance(MemoryResource*memRes):pMemRes{memRes}{ } public: staticManagedInstancewith(MemoryResource*memRes){ returnManagedInstance{memRes}; } template<typename...Args> PointerTypecreate(Args&&...args){ pma::PolyAllocator<TTarget>alloc{pMemRes}; autodeleter=[alloc](TBase*ptr)mutable{ alloc.deleteObject(static_cast<TTarget*>(ptr)); }; return{alloc.newObject(std::forward<Args>(args)...),deleter}; } private: MemoryResource*pMemRes; }; }//namespaceimpl template<classTTarget,classTBase=TTarget> usingUniqueInstance=impl::ManagedInstance<std::unique_ptr<TBase,std::function<void(TBase*)>>,TTarget,TBase>; template<classTTarget,classTBase=TTarget> usingSharedInstance=impl::ManagedInstance<std::shared_ptr<TBase>,TTarget,TBase>; }//namespacepma