您總是可以添加另一個間接層以避免operator&
和醜陋Attach
或Detach
的可怕超載,並從那裏返回一個預先封裝的實例。
如果你能在VS2010或GCC使用的C++ 0x,或在訪問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()
時,註冊表項會被關閉。
對於這樣的情況,我想我更喜歡Attach()和Detach()模型。你可以實現一個&運算符,但我覺得它是一個很醜陋的。沒有一個真正的答案;這更多的是個人喜好。 – Luke 2011-04-20 22:18:40