在Win32中经常会遇到HANDLE——到处都是HANDLE。
所以,我写了一个工具类,使用RAII来管理HANDLE:
#ifndef _UNIQUE_HANDLE_H
#define _UNIQUE_HANDLE_H
#include <Windows.h>
#include <type_traits>
#include "unique_resource.hpp"
using namespace std_experimental;
template <
typename H = HANDLE,
typename D = decltype(::CloseHandle)>
class UniqueHandle : public unique_resource<H, D>
{
public:
explicit UniqueHandle(H handle=NULL) noexcept
: unique_resource(handle, ::CloseHandle)
{
}
using unique_resource<H, D>::unique_resource;
explicit operator bool() const
noexcept(!std::is_convertible_v<H, decltype(NULL)>
|| std::is_nothrow_convertible_v<H, decltype(NULL)>)
{
using winnull_t = decltype(NULL);
if constexpr (std::is_convertible_v<H, winnull_t>)
return static_cast<winnull_t>(this->get()) != NULL;
else
return true;
}
bool valid() const
noexcept(!std::is_convertible_v<H, decltype(INVALID_HANDLE_VALUE)>
|| std::is_nothrow_convertible_v<H, decltype(INVALID_HANDLE_VALUE