Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Enum с сильной типизацией  (Прочитано 8401 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« : 26-09-2008 13:13 » 

игрался тут с енумами с сильной типизацией. в итоге:
Код:
	struct StrongEnum
{
enum EnumType
{
eValue1,
eValue2
};
EnumType value_;

StrongEnum() : value_(eValue1) {}
StrongEnum(EnumType e) : value_(e) {}
bool operator==(EnumType e) const { return value_ == e; }
bool operator!=(EnumType e) const { return value_ != e; }
bool operator==(StrongEnum e) const { return value_ == e.value_; } // возможно лишнее
bool operator!=(StrongEnum e) const { return value_ != e.value_; } // возможно лишнее

StrongEnum & operator=(EnumType e)
{
value_ = e;
return *this;
}
};

хотел оформить шаблоном, но были некоторые проблемы так что пока так.
может у кого еще есть, примеры?
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 26-09-2008 16:48 » 

так то оно так... А зачем ? Какой смысл так городить?
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 29-09-2008 04:53 » 

смысл такой, что енум неявно приводится к целочисленному типу, а описанный класс нет.
любят некоторые программисты антипаттерн "волшебное число" вместо емумов использовать, вот это небольшая защита от них, да и в коде удобней искать, тут на днях заставил метод возвращать вместо long обёртку над енумом и сразу нашел просто кучу мест, где вместо значений енума используются числовые эквиваленты.
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 29-09-2008 05:00 » 

>>антипаттерн "волшебное число"
 - это как ? ))
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 29-09-2008 05:25 » 

http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80)

суть антипаттерна в том, что в код забивается число вместо создания константы или енума с мнемоническим названием
пример
Код:
......
switch (type){
case 15: // Почему именно 15? откуда взято это число и где еще оно используется?
     DoSome();
     break;
......
case 10: // Почему именно 10? откуда взято это число и где еще оно используется?
     DoSome();
     break;
default:
     break;
}

пример 2:
Код:
class A
{
    enum EnumType { eDigit = 0, eSpace, eAlpha };
   
    EnumType GetType();
}

bool UseType(long t)
{
..................
    if (t == 2)
       return false;
....................   
}

int main()
{
    A a;
    ..............
     bool res = UseType(a.GetType()); // что будет, если мы изменим значения в енуме? и сколько в коде мест, где может рвануть
    ..............

    return 0;
}
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines