2013-09-10 6 views
1

В документации к GetQueuedCompletionStatus(), MSDN говоритC++ - стиль указатель приведение к целому числу

Это делается путем указания правильного дескриптора события для элемента hEvent перекрытой структуры, и установив его младший бит ,

Как это сделать с использованием стилей в стиле C++, учитывая, что событие имеет тип HANDLE, typedef of void *? Я не могу напрямую применить | = 1 к указателю, reinterpret_cast преобразует типы с одним и тем же уровнем косвенности, а static_cast также не работает. Каков способ C++ сделать это, избегая приведения C-стиля и используя C++-стиль для преобразования в size_t? Я знаю, что альтернативой является использование союза, но это кажется еще более взломанным, чем использование C-style cast.

+2

переинтерпретировать-литая работает отлично ... –

+0

Так у вас есть указатель, который указывает на тип данных, кроме целого, и вы хотели бы, чтобы бросить это указывало на данные в int? – Matt

ответ

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, ...); 
+3

Я считаю, что если вы хотите использовать результат 'reinterpret_cast' как lvalue, который вы должны использовать для ссылки на reinterpret_cast (MyOverlapped.hEvent) | = 0x1;'. – imreal

+1

Кастинг для 'unsigned int' (или' unsigned int & ') может быть не идеальным, если указатель 64 бит ... Он предпочитает видеть' uintptr_t' ... –

+1

@Nick - спасибо за комментарии (+1) - сделанные изменения. – franji1

Смежные вопросы