相关疑难解决方法(0)

非指针上的RAII单线程?

相关主题

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)

c++ winapi raii

13
推荐指数
3
解决办法
3142
查看次数

标签 统计

c++ ×1

raii ×1

winapi ×1