相关主题
std :: unique_ptr,deleters和Win32 API
要将Win32句柄用作RAII,我可以使用以下行
std::unique_ptr<std::remove_pointer<HANDLE>::type, decltype(&CloseHandle)> m_mutex(CreateMutex(NULL, FALSE, NULL), &::CloseHandle);
Run Code Online (Sandbox Code Playgroud)
对我来说,这是一个干净的单行,并完全符合我的要求.
说到SOCKET,它不会用同一行编译,因为SOCKET不能是nullptr.
我需要做的是使其工作如下:
struct SocketDeleter
{
typedef SOCKET pointer;
void operator()(SOCKET h)
{
::closesocket(h);
}
};
// Start listen socket.
std::unique_ptr<SOCKET, SocketDeleter> sock(socket(AF_UNSPEC, SOCK_STREAM, IPPROTO_UDP));
Run Code Online (Sandbox Code Playgroud)
我在这个实现中不喜欢的是我想要使用的任何不同类型的资源,我需要复制/粘贴相同的代码才能更改关闭函数.
我可以使用宏,但这非常难看,不能使用两次
#define RAII_UNIQUE_RESOURCE(varName, classType, init, closure) \
struct deleterMacro \
{ \
typedef classType pointer; \
void operator()(classType h) \
{ \
closure(h); \
} \
}; \
std::unique_ptr<classType, deleterMacro> varName(init);
// Compile, but breaks as soon as 2 sockets defined.
RAII_UNIQUE_RESOURCE(sock, …Run Code Online (Sandbox Code Playgroud)