#pragma once #include #include template class wrapped_ptr { public: template explicit wrapped_ptr(Obj * (*factory)(Params...), Args &&... args) : obj {factory(std::forward(args)...)} { } explicit wrapped_ptr(wrapped_ptr && p) : obj {p.obj} { p.obj = nullptr; } ~wrapped_ptr() { if (obj) { Destroy(obj); } } NO_COPY(wrapped_ptr); wrapped_ptr & operator=(wrapped_ptr && p) { if (obj) { Destroy(obj); } obj = p.obj; p.obj = nullptr; return *this; } [[nodiscard]] inline operator Obj *() const noexcept { return obj; } [[nodiscard]] inline auto operator->() const noexcept { return obj; } [[nodiscard]] inline auto get() const noexcept { return obj; } protected: explicit wrapped_ptr(Obj * o) : obj {o} { } Obj * obj; }; template class wrapped_ptrt : public wrapped_ptr { public: template explicit wrapped_ptrt(Args &&... args) : wrapped_ptr {Create(std::forward(args)...)} { } };