我创建了一个类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语句禁用警告,我无法修改枚举。
答案 0 :(得分:5)
我不会在这里通过static_cast进行电子邮件拦截,但如果你是:
template <class T>
inline UCHAR ToUchar(T t)
{
return static_cast<UCHAR>(t);
}
为每个枚举保存写一个函数。