Я пытаюсь удалить приведение в стиле c из кода, над которым я работаю, и меня беспокоит единственная альтернатива.
Исходный код был:
WPARAM param = (WPARAM)(GetDlgItem(IDC_WORKFLOW).m_hWnd);
this->PostMessage(WM_NEXTDLGCTL, param, TRUE);
Если я использую статическое приведение:
WPARAM param = static_cast<WPARAM>(GetDlgItem(IDC_WORKFLOW).m_hWnd);
this->PostMessage(WM_NEXTDLGCTL, param, TRUE);
Я получаю сообщение об ошибке «static_cast»: невозможно преобразовать из «HWND» в «WPARAM», потому что нет допустимого преобразования между базовыми типами. Это оставляет мне «вариант дьявола»:
WPARAM param = reinterpret_cast<WPARAM>(GetDlgItem(IDC_WORKFLOW).m_hWnd);
this->PostMessage(WM_NEXTDLGCTL, param, TRUE);
Насколько я понимаю, если static_cast невозможен, и это не связано с константностью, C-cast все равно должен выполнять reinterpret_cast, что означает, что базовый код должен возвращаться, , что означает, что это безопасно (пункт 3 в комментариях). Но я хотел бы подтвердить это, прежде чем просто менять код.
Безопасно ли это приведение в данном конкретном случае и как мне это подтвердить? Если нет, то какой альтернативный вариант?
void *
. - person Michael Foukarakis   schedule 13.02.2014