#define __PREVENT_DESTRUCTION(self) \ ~self() = delete #define __PREVENT_JUST_CONSTRUCTION(self) \ self() = delete #define __PREVENT_CONSTRUCTION(self) \ __PREVENT_JUST_CONSTRUCTION(self); \ __PREVENT_DESTRUCTION(self) #define __PREVENT_COPY(self) \ self(const self &) = delete; \ self &operator=(const self &) = delete