Re: [Trick] Делаем правильные enum'ы
От: Аноним  
Дата: 10.09.07 14:43
Оценка: 1 (1)
Скажите, а как решает ваше (или любое другое здесь) предложение проблему описанную Саттером:

At minimum, the programmer manually wraps the enum inside a class to get type-safety...
This solution can be close to ideal logically, but a full-blown class is not a POD and many ABIs fail to
pass small structures in registers, so turning an enum into a class for logical reasons may impose a
surprising (and sometimes significant) cost on its users.

взято Strongly Typed Enums (revision 3).
Re[2]: [Trick] Делаем правильные enum'ы
От: remark Россия http://www.1024cores.net/
Дата: 10.09.07 17:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Скажите, а как решает ваше (или любое другое здесь) предложение проблему описанную Саттером:

А>

А>At minimum, the programmer manually wraps the enum inside a class to get type-safety...
А>This solution can be close to ideal logically, but a full-blown class is not a POD and many ABIs fail to
А>pass small structures in registers, so turning an enum into a class for logical reasons may impose a
А>surprising (and sometimes significant) cost on its users.

А>взято Strongly Typed Enums (revision 3).

Никак
Оно скорее создаёт эту проблему


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: [Trick] Делаем правильные enum'ы
От: alexeiz  
Дата: 11.09.07 06:25
Оценка:
Здравствуйте, remark, Вы писали:

R>Если не поленюсь, запосчу ещё свою реализацию енума с возможностью связывания произвольных тегов к значениям. Это ваще крута! Такого точно ни у кого нет!


Давай!
Re[2]: [Trick] Делаем правильные enum'ы
От: alexeiz  
Дата: 11.09.07 07:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Скажите, а как решает ваше (или любое другое здесь) предложение проблему описанную Саттером:

А>

А>At minimum, the programmer manually wraps the enum inside a class to get type-safety...
А>This solution can be close to ideal logically, but a full-blown class is not a POD and many ABIs fail to
А>pass small structures in registers, so turning an enum into a class for logical reasons may impose a
А>surprising (and sometimes significant) cost on its users.

А>взято Strongly Typed Enums (revision 3).

"many ABIs fail to pass small structures in registers"

Это по большей части не проблема (на тех платфортмах, которые меня интересуют).

"full-blown class is not a POD"

Конечно, класс уже не POD, но насколько это важно? На большинстве платформ и компиляторов если класс достаточно простой, как в этом случае, с ним можно обращаться как с POD. Да, это будет за пределами поведения, гарантированного стандартом. Но на практике проблем не будет.
Re: [Trick] Делаем правильные enum'ы
От: jazzer Россия Skype: enerjazzer
Дата: 11.09.07 08:08
Оценка: 6 (2)
Здравствуйте, remark, Вы писали:

R>Наверное многие задавались вопросом — почему сделано так странно и нелогично, почему enum'ы выносят имена своих констант в окружающее пространство имён, хотя объявлены константы вроде как внутри самого enum'а?


R>Фиксим багу:


По мне, пространства имен лучше, во-первых, потому что для них, в отличие от классов, можно юзать using в разных вариантах, в зависимости от локальной обстановки (конфликты имен и т.п.):
namespace Colors { enum Color {red,green}; }

int main()
{
  Colors::Color x = Colors::red; // обе квалификации нужны

  using Colors::Color;
  Color y = Colors::red; // нужна квалификация только red

  using namespace Colors;
  Color z = red; // не нужны никакие квалификации
}

А во-вторых, енум остается енумом, а не превращается в класс (т.е, например, он остается POD-ом, что часто бывает важно — многие продвинутые библиотеки применяют для подов разные оптимизации типа memcpy/memmove/memcmp, поды можно передавать во всякие printf, и т.п.)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: [Trick] Делаем правильные enum'ы
От: anonim_44ax  
Дата: 11.09.07 08:53
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Конечно, класс уже не POD, но насколько это важно? На большинстве платформ и компиляторов если класс достаточно простой, как в этом случае, с ним можно обращаться как с POD. Да, это будет за пределами поведения, гарантированного стандартом. Но на практике проблем не будет.


Согласен, в большинстве случаев (т.е. кроме таких клинических, как программирование всяких кристаллов и т.п.) так оно и есть. Но проблема еще в сложности кода: лучшим по-моему предложение было именно здесь
Автор: alexeiz
Дата: 08.09.07
, но как не сложно заметить, код класса довольно сложный (ну, или скажем объёмный), чего по понятным причинам очень бы хотелось избежать. И поэтому сделать правильный выбор между полностью правильными enum-мами, используя "костыль", или юзать все-таки структуры-обёртки.
Re[2]: [Trick] Делаем правильные enum'ы
От: remark Россия http://www.1024cores.net/
Дата: 12.09.07 19:41
Оценка:
Здравствуйте, shadone, Вы писали:

S>особенно удобно использовать в пользовательских приложениях — например из значений enum'а сделать combobox:

S>
S>foreach(color c, color::all())
S>  comboBox->add(c.name(), c.value());
S>


Смотри здесь
Автор: remark
Дата: 12.09.07

Может тебе будет интересна идея связывания с енумом ещё для кучи и произвольного тэга
Мета-программирование полное


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: [Trick] Делаем правильные enum'ы
От: remark Россия http://www.1024cores.net/
Дата: 12.09.07 19:42
Оценка:
Здравствуйте, alexeiz, Вы писали:

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


R>>Если не поленюсь, запосчу ещё свою реализацию енума с возможностью связывания произвольных тегов к значениям. Это ваще крута! Такого точно ни у кого нет!


A>Давай!


Пжаласта
Автор: remark
Дата: 12.09.07



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: [Trick] Делаем правильные enum'ы
От: Awaken Украина  
Дата: 13.09.07 07:06
Оценка:
S>>мы пошли еще немного дальше и каждому значению enum'а присвоили текстовое имя.
MS>
MS>      std::transform(map.begin(), map.end(),
MS>        std::back_inserter(enum_list), 
MS>        bind(constructor<NamedEnumWrapper<Base_t> >(),
MS>          (&boost::lambda::_1 ->* &NameMap::value_type::first)));
MS>


вот почему некоторые манагеры запрещают буст
Re[4]: [Trick] Делаем правильные enum'ы
От: remark Россия http://www.1024cores.net/
Дата: 13.09.07 08:19
Оценка:
Здравствуйте, Awaken, Вы писали:

S>>>мы пошли еще немного дальше и каждому значению enum'а присвоили текстовое имя.

MS>>
MS>>      std::transform(map.begin(), map.end(),
MS>>        std::back_inserter(enum_list), 
MS>>        bind(constructor<NamedEnumWrapper<Base_t> >(),
MS>>          (&boost::lambda::_1 ->* &NameMap::value_type::first)));
MS>>


A>вот почему некоторые манагеры запрещают буст


BOOST_FOREACH — убийца стандартных алгоритмов


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: [Trick] Делаем правильные enum'ы
От: remark Россия http://www.1024cores.net/
Дата: 20.01.08 14:23
Оценка:
Здравствуйте, remark, Вы писали:

R>Наверное многие задавались вопросом — почему сделано так странно и нелогично, почему enum'ы выносят имена своих констант в окружающее пространство имён, хотя объявлены константы вроде как внутри самого enum'а?



Может все мужики уже давно знают, то я только обнурижил, что MSVC2005 позволяет писать так:

enum A {A1, A2, A3};

int main()
{
    A a1 = A1;
    A a2 = A::A2;
}


Хоть и с варнингом о ms-specific... который впрочем, если уж портирование не требуется, можно смело подавить.


R>


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: [Trick] Делаем правильные enum'ы
От: Trapper  
Дата: 21.01.08 08:37
Оценка:
Здравствуйте, remark, Вы писали:

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


R>>Наверное многие задавались вопросом — почему сделано так странно и нелогично, почему enum'ы выносят имена своих констант в окружающее пространство имён, хотя объявлены константы вроде как внутри самого enum'а?



R>Может все мужики уже давно знают, то я только обнурижил, что MSVC2005 позволяет писать так:


R>
R>enum A {A1, A2, A3};

R>int main()
R>{
R>    A a1 = A1;
R>    A a2 = A::A2;
R>}
R>


R>Хоть и с варнингом о ms-specific... который впрочем, если уж портирование не требуется, можно смело подавить.



Боян
Ещё вроде с VS 6 было такое, а может и раньше.
Ну и намучились мы с этим, когда портировали код под gcc
Хотя по мне, так логичнее A::A2, нежели просто A2

R>>

R>

Разумеется,
Trapper
Re: [Trick] Делаем правильные enum'ы
От: Roman Odaisky Украина  
Дата: 22.01.08 15:40
Оценка: 7 (1)
#define DECL_ENUM(_name_, _elements_) namespace _name_ { enum TheEnum { BOOST_PP_SEQ_ENUM(_elements_) }; }

DECL_ENUM(Color, (Cyan)(Magenta)(Yellow)(Key))

#define enum(name) name::TheEnum

enum(Color) color = Color::Yellow;
До последнего не верил в пирамиду Лебедева.
Re: [Trick] Делаем правильные enum'ы
От: demi США  
Дата: 22.01.08 16:10
Оценка:
Здравствуйте, remark, Вы писали:

R>Наверное многие задавались вопросом — почему сделано так странно и нелогично, почему enum'ы выносят имена своих констант в окружающее пространство имён, хотя объявлены константы вроде как внутри самого enum'а?


Жаль что со switch-ем нельзя сделать так как-нить(код ниже) — то есть сэмулировать enum в том виде в котором он есть скажем в C#. Потому что enum приводится к int и все:

// В условиях вашего примера
color c = ...;
switch (c)
{
  case color::red: // Можно
      break;
  case 3: // Запретить бы int-ы... Это было бы круто!
      break;
}


Как там у классиков: за изобретение 5, по предмету... +1 скажем так
Не стыдно попасть в дерьмо, стыдно в нём остаться!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.