Как правильно привернуть 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());
Сборка персонального компьютера от Artline: умный выбор для современных пользователей