在GetQueuedCompletionStatus()的文档中,MSDN说
这是通过为hEvent成员指定有效的事件句柄来完成的 OVERLAPPED结构,并设置其低位。
如果事件的类型为HANDLE,type *为void *,我如何使用C ++样式转换?我不能直接对指针应用| = 1,reinterpret_cast仅在具有相同间接级别的类型之间进行转换,而static_cast也不起作用。 C ++的做法是什么,避免使用C风格的转换并使用C ++风格转换为size_t?我知道另一种方法是使用联合,但这似乎比使用C风格的强制转换更加糟糕。
答案 0 :(得分:4)
reinterpret_cast就是你所需要的:
OVERLAPPED MyOverlapped;
// ...
MyOverlapped.hEvent = GetEvent(); // replace with whatever O/S call that is provided the event handle
ASSERT((reinterpret_cast<uintptr_t>(MyOverlapped.hEvent) & 0x1) == 0x0); // if lsbit is a flag, then OS source of hEvent better NOT have it INITIALLY set!
reinterpret_cast<uintptr_t &>(MyOverlapped.hEvent) |= 0x1;
// ...
GetQueuedCompletionStatus(..., &MyOverlapped, ...);