Вы всегда можете добавить еще один слой косвенности, чтобы избежать ужасной перегрузки operator&
и уродливых Attach
или Detach
и вернуть оттуда предварительно упакованный экземпляр.
Если вы можете использовать C ++ 0x в VS2010 или gcc или иметь другие способы доступа к std::unique_ptr<>
, то вы можете сделать это (проверка краткости не указана):
struct hkey_deleter
{
void operator()(HKEY hkey)
{
::RegCloseKey(hkey);
}
};
typedef std::unique_ptr<HKEY__, hkey_deleter> regkey;
regkey MyRegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired)
{
HKEY hOpenedKey = NULL;
::RegOpenKeyEx(hKey, lpSubKey, ulOptions, samDesired, &hOpenedKey);
return regkey(hOpenedKey);
}
void SomewhereElse()
{
...
regkey r = MyRegOpenKeyEx(HKEY_CLASSES_ROOT, nullptr, 0, KEY_READ);
...
}
hkey_deleter
гарантирует, что раздел реестра будет закрыт при выходе из области или при вызове regkey::reset()
.