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

for*_*idt 0 c++ enums boost integer

我创建了一个CMyClassCTor采用UCHARas参数的类.该参数可以具有各种枚举的值(都保证适合a 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);
Run Code Online (Sandbox Code Playgroud)

上面的代码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);
}
Run Code Online (Sandbox Code Playgroud)

然后上面的代码如下所示:

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));
Run Code Online (Sandbox Code Playgroud)

这是迄今为止我能想到的最干净的方法.

有没有更好的方法?
也许boost有一些不错的东西可供选择?

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

fiz*_*zer 5

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

template <class T>
inline UCHAR ToUchar(T t)
{
    return static_cast<UCHAR>(t);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 不,推导出模板参数:ToUchar(SomeEnumMember) (3认同)
  • 这个简洁解决方案的唯一缺点是它允许在没有编译器警告的情况下将错误的枚举转换为UCHAR.显式构造函数确保只使用预期使用的枚举而不发出警告. (2认同)