#pragma once #include #include template class glRef { public: template explicit glRef(Args &&... args) : id {(*get)(fixed..., std::forward(args)...)} { if (!id) { throw std::runtime_error("Get function failed"); } } glRef(glRef && other) : id {other.id} { other.id = {}; } ~glRef() { if (id) { (*release)(id); } } NO_COPY(glRef); const auto & operator=(glRef && other) { if (id) { release(id); } id = other.id; other.id = {}; return *this; } auto operator*() const { return id; } auto operator->() const { return id; } operator IdType() const { return id; } private: IdType id; };