본문 바로가기
C,C++/Etc

[C++] void*에서 enum 타입으로 캐스팅 하는 법 | cast void* to enum

by woohyeon 2020. 10. 31.
반응형

윈도우즈 프로그래밍 도중 void*을 인자로 받는 함수에 enum 타입을 캐스팅하여 전달하였는데, 그 함수 내에서 다시 enum 타입으로 변환하여 switch문에 활용하려 했다. if문을 사용하면 되지만 그냥 switch case를 사용하고 싶었음. 그래서 캐스팅 방법을 알아보던 도중 void*을 uintptr_t 타입으로 변환할 수 있는 것을 알게 됨. uintptr_t는 unsigned int 타입을 재정의한 것으로 이름과 달리 포인터 타입이 아님. 이 타입은 WinAPI의 UINT_PTR 타입과 동일한데, 어디서 본 것 같은 타입. WPARAM이 바로 UINT_PTR 타입.

어쨌든 다음과 같이 void*를 두 단계에 거쳐 enum 타입으로 변환할 수 있다. enum class 타입도 동일하게 가능. 하지만 enum에서 void*로 변환한 결과는 할당되지 않은 메모리 주소이므로 역참조하지 않도록 조심. 

 

enum eColor
{
    RED = 1,
    GREEN,
    BLUE
};

eColor color1 = eColor::RED;
eColor color2 = eColor::GREEN;
eColor color3 = eColor::BLUE;

// eColor to void* 
void* voidPtr1 = reinterpret_cast<void*>(color1);
void* voidPtr2 = reinterpret_cast<void*>(color2);
void* voidPtr3 = reinterpret_cast<void*>(color3);

// void* to eColor
// void* -> uintptr_t -> eColor

// void* to uintptr_t 
auto red   = reinterpret_cast<uintptr_t>(voidPtr1);
auto green = reinterpret_cast<uintptr_t>(voidPtr2);
auto blue  = reinterpret_cast<uintptr_t>(voidPtr3);

// uintptr_t to eColor
auto result1 = static_cast<eColor>(red);
auto result2 = static_cast<eColor>(green);
auto result3 = static_cast<eColor>(blue);

switch(result2)
{
case eColor::RED:
    cout << "it's a red" << endl;
    break;

case eColor::GREEN:
    cout << "it's a green" << endl;
    break;
    
case eColor::BLUE:
    cout << "it's a blue" << endl;
}

 

 

<Output>




댓글