Re: Преобразование enum в enum
От: remark Россия http://www.1024cores.net/
Дата: 02.01.08 15:33
Оценка: 2 (1) +2
Здравствуйте, YuriyT, Вы писали:

YT>День добрый.

YT>Подскажите, пожалуйста,
YT>есть enum в разных пространствах:

YT>Есть ли решения получше?



Если хотя бы одно место можно менять, то использовать одно определение.

namespace NS1
{
  enum Color {red, green};
}

namespace NS2
{
  using NS1::Color;
}



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Преобразование enum в enum
От: Kislorod Украина  
Дата: 02.01.08 16:57
Оценка: 1 (1)
А зачем в разных пространствах имен объявлять одни и теже сущности? А потом еще и взаимосвязь им настраивать руками? Может быть лучше вынести enum Color в отдельный namespace и пусть из NM1 и NM2 используют константы из этого пространства имен..?
Re: Преобразование enum в enum
От: Tonal- Россия www.promsoft.ru
Дата: 02.01.08 21:02
Оценка: 1 (1)
Если имеется в виду, что тебе нужно, чтобы одноимённые члены перечислений преобразовывались друг в друга, то можно немного подправить код из Копирование по маске
Автор: Tonal-
Дата: 22.12.07
.

Т.е. для одного из перечислений переопределяешь свойства
struct enum_trait<NS1::Color> {
  #define enum_val_type(enum_val_name) \
    typedef enum_val_traits(NS1::Color, fld_name) \
    enum_val_name##_type;
  enum_val_type(red);
  enum_val_type(green);
  enum_val_type(blue);

  typedef mpl::list<
    red_type, green_type, blue_type
  > fields_map;
};

Ну а в коде используешь каст:
NS2::Color val = enum_cast<NS2::Color>(NS1::red);


Тут надо ещё подумать как обрабатывать случаи, когда в приёмнике нет соответствующих имён.
Можно выбрасывать исключение, устанавливать в указанное значение, или в значение источника. Это можно определять стратегиями, или написать разные функции.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Преобразование enum в enum
От: YuriyT Украина  
Дата: 02.01.08 15:25
Оценка:
День добрый.
Подскажите, пожалуйста,
есть enum в разных пространствах:
namespace NS1
{
  enum Color {red, green};
};

namespace NS2
{
  enum Color {red, green};
};

нужно преобразовать NS1::Color в NS2::Color,
один из вариантов:
NS1::Color val = NS1::red;
NS2::Color val2(val1);

не нравится тем что NS1::Color может измениться, позабыв об NS2::Color.
либо
 
bool convert(NS1::Color& from, NS2::Color& to)
{
   bool isOk = true;
   switch(rom)
   {
       NS1::red:   
          to = NS2::red;  
          break;
       NS1::green: 
          to = NS2::green;            
          break;
       default:    
          isOk = false;
   }
   return isOk;
}

Есть ли решения получше?
Re[2]: Преобразование enum в enum
От: YuriyT Украина  
Дата: 03.01.08 08:33
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, YuriyT, Вы писали:


YT>>День добрый.

YT>>Подскажите, пожалуйста,
YT>>есть enum в разных пространствах:

YT>>Есть ли решения получше?



R>Если хотя бы одно место можно менять, то использовать одно определение.


R>
R>namespace NS1
R>{
R>  enum Color {red, green};
R>}

R>namespace NS2
R>{
R>  using NS1::Color;
R>}
R>


R>


да, только одно пространство можно менять,
но компилируется только такой код
namespace NS1
{
  enum Color {red, green};
}

namespace NS2
{
  using NS1::Color;
  using NS1::red;
  using NS1::green; 
}


в любом случае это лучше первоначального варианта,
спасибо
Re[2]: Преобразование enum в enum
От: YuriyT Украина  
Дата: 03.01.08 08:40
Оценка:
Здравствуйте, Kislorod, Вы писали:

K>А зачем в разных пространствах имен объявлять одни и теже сущности? А потом еще и взаимосвязь им настраивать руками? Может быть лучше вынести enum Color в отдельный namespace и пусть из NM1 и NM2 используют константы из этого пространства имен..?

Согласен, нет смысла, но код уже написан,
и менять можно только одно пространство
Re[2]: Преобразование enum в enum
От: YuriyT Украина  
Дата: 03.01.08 08:55
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Если имеется в виду, что тебе нужно, чтобы одноимённые члены перечислений преобразовывались друг в друга, то можно немного подправить код из Копирование по маске
Автор: Tonal-
Дата: 22.12.07
.

Да, это и имеется в виду.
Нельзя использовать boost, stl, исключения.
Должно работать в VC6
Re[3]: Преобразование enum в enum
От: Tonal- Россия www.promsoft.ru
Дата: 03.01.08 09:37
Оценка:
Здравствуйте, YuriyT, Вы писали:
T>>Если имеется в виду, что тебе нужно, чтобы одноимённые члены перечислений преобразовывались друг в друга, то можно немного подправить код из Копирование по маске
Автор: Tonal-
Дата: 22.12.07
.

YT>Да, это и имеется в виду.
YT>Нельзя использовать boost, stl, исключения.
YT>Должно работать в VC6
VC6 вроде только SFINAE не разумеет. Остальное несложно руками.
Но и SFINAE там нужно только для случая, когда в перечислении источнике нет какого-нибудь имени из получателя (предпологается что enum_traits для получателя).
Если наборы имён совпадают, можно обойтись.
Плюс этого решения в том, что не одно пространство имён изменять не нужно.
Но и если тебе подходит решение с using-ом — лучше взять его — гораздо проще и прозрачнее. К тому же совпадение по значениям.
Хотя, если таки хочется исеть "своё" перечисление в каждом, то можно так:
namespace NS2 {
  enum Color {red=NS1::red, green=NS1::green};
};

И потом static_cast.
... << RSDN@Home 1.2.0 alpha rev. 786>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.