как правильно привернуть HBITMAP к make_unique вместе с deleter'ом

156
26 октября 2019, 12:50

Как правильно привернуть HBITMAP к make_unique вместе с deleter'ом, под deleter'ом подразумевается вызов DeleteObject(..). VS ругается по всякому на мои конструкции :)

Заранее спасибо за пример.

Answer 1

В такой ситуации, вместо того, чтобы лезть в детали реализации виндовсовких хендлов и вытаскивать на поверхность тот факт, что хендлы на самом деле являются указателями, правильнее было бы приспособить std::unique_ptr для работы с обобщенным хэндлом. std::unique_ptr предоставляет вам все необходимые для этого средства.

По аналогии с Лямбда в умных указателях вместо функторов, напишите свой удалятель

struct GdiHandleDeleter
{
  using pointer = HGDIOBJ;
  void operator ()(HGDIOBJ h) const
    { DeleteObject(h); }
};

и используйте его потом в std::unique_ptr

using hbmp_unique_ptr = std::unique_ptr<HBITMAP, GdiHandleDeleter>;
hbmp_unique_ptr ptr(CreateBitmap(...));

При таком удалятеле, однако, ptr.get() будет возвращать HGDIOBJ, а не HBITMAP. Если для вас критично сохранение разделения типов между HBITMAP, HBRUSH и т.д., то лучше генерировать свой удалятель для каждого типа GDI объекта.

Использование std::make_unique тут неуместно, ибо std::make_unique всегда создает хранимый объект через вызов new. Вам это здесь ни к чему.

Answer 2

Как верно подметил @Harry, make_unique не имеет настраиваемого deleter'а. По этому прикручиваем к типу unique_ptr:

struct HBMPFree
{
    void operator()(HBITMAP hbmp) const noexcept { DeleteObject(hbmp); }
};
using hbmp_unique_ptr = std::unique_ptr<HBITMAP__, HBMPFree>;
auto hbmp = hbmp_unique_ptr(GetHbmpFunction());
if (!hbmp.get())
{
   /// error
}
HBITMAP phbmp = static_cast<HBITMAP>(hbmp.get());
READ ALSO
Почему нету вывода с функции Users.ShowList()? [закрыт]

Почему нету вывода с функции Users.ShowList()? [закрыт]

посмотрите внимательно на эти строки

144
Книги по OpenGL для начинающих [закрыт]

Книги по OpenGL для начинающих [закрыт]

Можете подсказать какие есть современные книги по OpenGl для начинающих и желательно на русском и по новее

150
построение Блок-схемы [закрыт]

построение Блок-схемы [закрыт]

ЗдраствуйтеНе подскажите какое либо пособие которые наглядно показывает как строить блок схемы для кодов C++ (а то я в этом вообще воробушек)

135
Работа с битовыми полями

Работа с битовыми полями

Необходимо записать в битовое поле датуКак это реализовать?

299