В этой теме уже рассматривалась техника оборачивания WinAPI функций в unique_ptr, однако у меня возник вопрос как это должно реализовываться в функциях, возвратом которых является статус операции, а открываемый дескриптор указывается одним из параметров? К примеру, возьмем RegOpenKeyEx, как к данной функции применить аналогичный подход?
Сначала отдельно вызвать RegOpenKeyEx, получить результат, а уже потом "передать его на сохранение" в unique_ptr. Получится не совсем RAII, но если между получением дескриптора и передачей его в unique_ptr не выбрасывается исключений, то цель RAII не нарушается
HKEY hkey{};
RegOpenKeyEx(..., &hkey);
std::unique_ptr<HKEY, HKEYCloser> unique_hkey(hkey);
Это при желании можно записать и через оператор "запятая"
HKEY hkey{};
std::unique_ptr<HKEY, HKEYCloser> unique_hkey((RegOpenKeyEx(..., &hkey), hkey));
Написать свою-функцию обертку для RegOpenKeyEx, которая будет именно возвращать результат через возвращаемое значение. (Те же замечания.)
Еще как-то...
Применение std::unique_ptr с системными хэндлам действительно сводится скорее к роли RAII-guard, а не к полноценному smart pointer. Т.е. задача RAII-guard состоит лишь в том, чтобы предотвратить утечку ресурса, а не в том, чтобы целиком подменить собой сам хэндл. Работать c хэндлом именно через std::unique_ptr будет действительно неудобно, как правильно заметил @VTT в комментариях. Для локальной работы лучше просто вычитывать из него хэндл и работать с хэндлом напрямую.
Продвижение своими сайтами как стратегия роста и независимости