2009-07-02 2 views
0

나는 CTor가 UCHAR을 인수로 취하는 클래스 CMyClass을 만들었습니다. 이 인수는 다양한 열거 형의 값을 가질 수 있습니다 (모두 UCHAR에 맞도록 보장됨). 해당 값을 UCHAR으로 변환해야합니다. 라이브러리 함수가 해당 유형의 매개 변수를 요구하기 때문입니다.열거 형 값을 정수형으로 변환 할 때 컴파일러 경고를 피하는 방법은 무엇입니까?

std::vector<CMyClass> myObjects; 
     boost::assign::push_back(myObjects) 
      (MemberOfSomeEnum) 
      (MemberOfSomeEnum); 

std::vector<CMyClass> myOtherObjects; 
     boost::assign::push_back(myObjects) 
      (MemberOfAnotherEnum) 
      (MemberOfAnotherEnum); 

위의 코드는 두 열거 멤버의 각과 CMessage의 ctor를 호출 한 다음에 그들을두고 :

나는 그 메시지 객체를 많이 작성하고 내가 사용하는 노력 boost::assign를 입력 저장해야 명부. 내 문제는 VC++ 9에서이 코드가 경고 C4244 (열거 형에서 UCHAR로 변환 중 데이터가 손실 될 수 있음)가 발생한다는 것입니다.

나의 현재 솔루션은 각 열거 유형에 대한 변환 함수 만드는 것입니다 :

static UCHAR ToUchar(const SomeEnum eType) 
{ 
    return static_cast<UCHAR>(eType); 
} 

static UCHAR ToUchar(const AnotherEnum eType) 
{ 
    return static_cast<UCHAR>(eType); 
} 

을 그리고 위의 코드는 다음과 같습니다

std::vector<CMyClass> myObjects; 
     boost::assign::push_back(myObjects) 
      (ToUchar(MemberOfSomeEnum)) 
      (ToUchar(MemberOfSomeEnum)); 

std::vector<CMyClass> myOtherObjects; 
     boost::assign::push_back(myObjects) 
      (ToUchar(MemberOfAnotherEnum)) 
      (ToUchar(MemberOfAnotherEnum)); 

이 내가 생각할 수있는 가장 깨끗한 방법입니다 지금까지.

더 좋은 방법이 있습니까?
부스트가 좋을 수도 있습니다.

나는 pragma 문으로 경고를 비활성화하고 enum을 수정할 수 없습니다.

답변

5

여기 static_cast에 의해 emabarrassed되지 않을 것이다, 그러나 당신이있는 경우 :

template <class T> 
inline UCHAR ToUchar(T t) 
{ 
    return static_cast<UCHAR>(t); 
} 

모든 열거 형에 대한 함수를 작성 절약 할 수 있습니다.

+0

이렇게하면 읽을 때마다 "ToUchar (SomeEnumMember)"을 쓸 필요가 있습니다. 저것은 나가 "청결한"에 의미 한 무슨이다. – foraidt

+3

아니요, 템플릿 인수가 추론됩니다. ToUchar (SomeEnumMember) – fizzer

+0

죄송합니다. 나는 코멘트를 쓰기 전에 그것을 시험해 보았 어야만했다 : -/ – foraidt