tgoop.com/cppproglib/5965
Create:
Last Update:
Last Update:
Если нужно управлять сложными ресурсами, то можно воспользоваться костюмными deleters.
FILE*, сокеты, OpenGL объекты требуют специального освобождения
// Универсальный RAII wrapper
template<typename T, typename Deleter>
class Resource {
T resource;
Deleter deleter;
bool owns_resource = true;
public:
Resource(T resource, Deleter deleter) : resource(resource)
, deleter(deleter) {}
~Resource() { if(owns_resource) deleter(resource); }
Resource(Resource&& other) : resource(other.resource)
, deleter(std::move(other.deleter))
, owns_resource(other.owns_resource)
{ other.owns_resource = false; }
Resource(const Resource&) = delete;
T get() const { return resource; }
T release() { owns_resource = false; return resource; }
};
// Использование
auto file = Resource(fopen("data.txt", "r"),
[](FILE* f) { if(f) fclose(f); });
Для совместимости с STL удобно использовать
std::unique_ptr с кастомным deleter.Библиотека C/C++ разработчика
#буст
