Можете ли вы объяснить это тогда для меня?
У нас есть это определение enum
:
enum class MenuNavigation : int {
File,
Edit,
View,
Options,
Help
};
В моем коде у меня есть места, где это делается:
theApp.UpdateMenuBitmap(m_mapMenuBitmap,
pView,
MAKEWPARAM(MenuNavigation::View,5), IDB_BMP_MENU_ZOOM, true);
Ключевой бит этого кода:
MAKEWPARAM(MenuNavigation::View,5)
Я не получаю ошибок усложнения для этого. Мы знаем, что MAKEWPARAM
определяется как:
#define MAKEWPARAM(l, h) ((WPARAM)(DWORD)MAKELONG(l, h))
Теперь я знаю, что могу изменить свой код следующим образом:
MAKEWPARAM(to_underlying(MenuNavigation::View),5)
Где to_underlying
определяется как:
template <typename E>
constexpr auto to_underlying(E e) noexcept
{
return static_cast<std::underlying_type_t<E>>(e);
}
Но почему компилятор не жаловался на необходимость приведения типа * stati c в первом экземпляре?
Update
MAKELONG
определяется как:
#define MAKELONG(a, b) ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))