将枚举值转换为整数值时,如何避免编译器警告?

时间:2009-07-02 12:43:54

标签: c++ boost enums integer

我创建了一个类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 CTor,然后将它们放入列表中。 我的问题是,此代码在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));

到目前为止,这是我能想到的最干净的方法。

有没有更好的方法?
也许boost会提供一些不错的东西?

我不想使用pragma语句禁用警告,我无法修改枚举。

1 个答案:

答案 0 :(得分:5)

我不会在这里通过static_cast进行电子邮件拦截,但如果你是:

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

为每个枚举保存写一个函数。