Как правильно привернуть HBITMAP к make_unique вместе с deleter'ом, под deleter'ом подразумевается вызов DeleteObject(..). VS ругается по всякому на мои конструкции :)
Заранее спасибо за пример.
В такой ситуации, вместо того, чтобы лезть в детали реализации виндовсовких хендлов и вытаскивать на поверхность тот факт, что хендлы на самом деле являются указателями, правильнее было бы приспособить 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
. Вам это здесь ни к чему.
Как верно подметил @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());
Виртуальный выделенный сервер (VDS) становится отличным выбором
Можете подсказать какие есть современные книги по OpenGl для начинающих и желательно на русском и по новее
ЗдраствуйтеНе подскажите какое либо пособие которые наглядно показывает как строить блок схемы для кодов C++ (а то я в этом вообще воробушек)