2009-07-02 2 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 CTOR с каждым из двух членов перечислений, а затем помещает их в список. Моя проблема заключается в том, что этот код выдает предупреждение C4244 (возможная потеря данных во время преобразования из перечисления в UCHAR) на VC++ 9.

Мое текущее решение создать функцию преобразования для каждого типа перечислений:

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 есть что предложить?

Я не хочу отключать предупреждения с инструкциями прагмы, и я не могу изменить перечисления.

ответ

5

Я бы не emabarrassed на static_cast, но если вы:

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

сохраняет написание функции для каждого перечисления.

+0

Это приведет к необходимости писать «ToUchar (SomeEnumMember)» каждый раз, что было бы менее читаемым. Вот что я имел в виду с «чистым». – foraidt

+3

Нет, аргумент шаблона выведен: ToUchar (SomeEnumMember) – fizzer

+0

Извините, вы правы! Я должен был попробовать это, прежде чем писать комментарий ...: -/ – foraidt