2009-07-02 115 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

相关问题