2009-07-02 42 views
0

我創建了一個類CMyClass,其CTor採用UCHAR作爲參數。該參數可以具有各種枚舉的值(全部保證適合於UCHAR)。我需要將這些值轉換爲UCHAR,因爲庫函數要求其參數爲該類型。將枚舉值轉換爲整數值時,如何避免編譯器警告?

我已經創造了不少的消息對象,並節省打字努力我用boost::assign

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

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

上面的代碼調用CMessage構造函數與每兩個枚舉成員,然後把它們放在名單。 我的問題是,這段代碼在VC++ 9上拋出警告C4244(在從enum轉換爲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)); 

這是我能想到的最乾淨的方法至今。

有沒有更好的方法?
也許提升有很好的提供?

我不想使用雜注語句禁用警告,我無法修改枚舉。

回答

5

我就不會被這裏的static_cast emabarrassed,但如果你是:

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

節省了寫一個函數爲每一個枚舉。

+0

這將導致不得不每次寫入「ToUchar (SomeEnumMember)」,這將會降低可讀性。這就是我的意思是「乾淨」。 – foraidt 2009-07-02 12:53:34

相關問題