#pragma once #include /// This template will be instanciated for each unique type, and the char variable will be ODR-used which gives it an unique address. template struct TypeIdentifier { static const char obj = 0; }; template struct DefaultDeleter { void operator()(T* ptr) const { delete ptr; } }; template struct RemoveMemberPtrImpl {}; template struct RemoveMemberPtrImpl { using Type = U; }; template using RemoveMemberPtr = typename RemoveMemberPtrImpl::Type;