CPPPROGLIB Telegram 5965
🥳 How to: RAII + Custom Deleters для ресурсов

Если нужно управлять сложными ресурсами, то можно воспользоваться костюмными 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++ разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14🥰3



tgoop.com/cppproglib/5965
Create:
Last Update:

🥳 How to: RAII + Custom Deleters для ресурсов

Если нужно управлять сложными ресурсами, то можно воспользоваться костюмными 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++ разработчика

#буст

BY Библиотека C/C++ разработчика | cpp, boost, qt


Share with your friend now:
tgoop.com/cppproglib/5965

View MORE
Open in Telegram


Telegram News

Date: |

There have been several contributions to the group with members posting voice notes of screaming, yelling, groaning, and wailing in different rhythms and pitches. Calling out the “degenerate” community or the crypto obsessives that engage in high-risk trading, Co-founder of NFT renting protocol Rentable World emiliano.eth shared this group on his Twitter. He wrote: “hey degen, are you stressed? Just let it out all out. Voice only tg channel for screaming”. A new window will come up. Enter your channel name and bio. (See the character limits above.) Click “Create.” Don’t publish new content at nighttime. Since not all users disable notifications for the night, you risk inadvertently disturbing them. In handing down the sentence yesterday, deputy judge Peter Hui Shiu-keung of the district court said that even if Ng did not post the messages, he cannot shirk responsibility as the owner and administrator of such a big group for allowing these messages that incite illegal behaviors to exist. Clear
from us


Telegram Библиотека C/C++ разработчика | cpp, boost, qt
FROM American