На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Как привести перечисление к типу?
    ExpandedWrap disabled
      enum EN{q, w, e, r};
      EN t;
    Требуется привести t к bool. Но не
    ExpandedWrap disabled
      (((int)t)!=0)
    , а по-своему.
    ExpandedWrap disabled
      enum EN{q, w, e, r};
      operator bool (const EN &en)
      {
       switch (en)
       {
        case q:
        case w:
        case e:
        case r: return true;
        break;
        default : return false;
        break;
       }
      }
      EN t;
    не комплится, пишет, что оператор приведения должен быть чиьм-то не статическим членом. А если он член, то пишет, что он должен принимать воид.
    ExpandedWrap disabled
      EN::operator bool
    и
    ExpandedWrap disabled
      enum class EN
    не помогают. Ни по отдельности, ни вместе.
      Оберни EN в класс или структуру, и перегружай что хочешь.
      Будет тебе счастье.
        Цитата JoeUser @
        Оберни EN в класс или структуру, и перегружай что хочешь.
        Будет тебе счастье.
        Я с этого начал. Пишет, что оператор-член приведения должен принимать воид.
        Сообщение отредактировано: Ирокез -
          Естественно. Он же метод, у него есть this. Его и должен кастовать. Зачем ему параметры?
            Ирокез, странный у тебя свич. Любой каст приведет к true.

            Добавлено
            Цитата Ирокез @
            что оператор приведения должен быть чиьм-то не статическим членом

            Правильно пишет - в перечислениях нет методов. Но можно реализовать класс/структуру/объединение со схожим функционалом, и там будет возможна перегрузка. Стандартное перечисление в лоб не расширить.
              Цитата Qraizer @
              Естественно. Он же метод, у него есть this. Его и должен кастовать. Зачем ему параметры?
              Должен он привести перечисление.

              Добавлено
              Цитата JoeUser @
              странный у тебя свич. Любой каст приведет к true.
              default к false.

              Добавлено
              Цитата JoeUser @
              Но можно реализовать класс/структуру/объединение со схожим функционалом, и там будет возможна перегрузка.
              Как?
                Цитата Ирокез @
                default к false.

                Так да default'а дело никогда не дойдет, ибо все возможные значения кастуются к true.
                  Цитата Ирокез @
                  Как?

                  Примерно вот так:

                  ExpandedWrap disabled
                    #include <iostream>
                    using namespace std;
                     
                    enum class Enum { Q,W,E,R };
                     
                    class EnumHolder {
                      public:
                       explicit EnumHolder(Enum e) : Value(e) {}
                       EnumHolder() = delete;
                       operator bool() const {
                         return (Value == Enum::Q || Value == Enum::W);
                       }
                      private:
                       Enum Value;
                    };
                     
                    int main() {
                      EnumHolder E(Enum::E);
                      if (E) {
                        std::cout << "Enum Q or W" << std::endl;
                      } else {
                        std::cout << "Enum E or R" << std::endl;
                      }
                      return 0;
                    }
                    Цитата JoeUser @
                    Так да default'а дело никогда не дойдет, ибо все возможные значения кастуются к true.
                    Ну как же все, когда defalut к false?
                      Цитата Ирокез @
                      когда defalut к false

                      А вот так.
                      Если все возможные значения приводят с true, то до default дело не дойдет никогда.
                      Вообще никогда. Совсем совсем, вообще вообще, никогда :lol:
                        А вот вопрос, кстати - имеет ли право оптимизатор в этом случае заменить эту функцию на return true?
                          Цитата OpenGL @
                          А вот вопрос, кстати - имеет ли право оптимизатор в этом случае заменить эту функцию на return true?
                          С какого перепугу? Скорей уж оптимизатор обязан заменить
                          ExpandedWrap disabled
                            p!=nullptr
                          на
                          ExpandedWrap disabled
                            true
                          , так как вероятность того, что попадётся единственное значение в миллиарды раз ниже вероятность невалидности перечисления.

                          Добавлено
                          Цитата JoeUser @
                          А вот так.
                          Если все возможные значения приводят с true, то до default дело не дойдет никогда.
                          Вообще никогда.
                          Ну как же все, когда всего три, из более, чем как минимум четырёх миллиардов?
                          Сообщение отредактировано: Ирокез -
                            Цитата Ирокез @
                            чем как минимум четырёх миллиардов?

                            Каких еще миллиардов? Указанное перечисление может принимать одно из четырех значений, которые и перечислены в switch. Иного быть не может, значит и до default дело не дойдет.
                              А по-твоему какова разрядность базового типа? 1 бит?

                              Добавлено
                              Цитата JoeUser @
                              Указанное перечисление может принимать одно из четырех значений, которые и перечислены в switch. Иного быть не может, значит и до default дело не дойдет.
                              Бред. Ты б хоть потестил. Перечисление может принимать любые значения своего базового типа, независимо от того, назначены им имена или нет.

                              Добавлено
                              Цитата JoeUser @
                              значит и до default дело не дойдет.
                              Гарантированно дойдёт. Дойдёт ли до остальных четырёх? Вот в чём вопрос. И я уже выбросил енам и полностью заменил его классом. Вместо членов перечисления статические константные экземпляры-члены, единственное поле (данное-член) – приватный указатель на экземпляр, конструктор по умолчанию копирует в него значение this, а присваивание и конструктор копий копируют туда удрес из копируемого объекта. Привидение к bool сравнивает адрес с адресами всех константных статических экземпляров-членов. Скормить свичу не получится, но пока это и не нужно.
                              Сообщение отредактировано: Ирокез -
                                Цитата Ирокез @
                                Бред. Ты б хоть потестил.

                                В плюсах "работает" не является аргументом поскольку в нём есть UB :D
                                  Цитата OpenGL @
                                  В плюсах "работает" не является аргументом поскольку в нём есть UB
                                  Не смешно. В вопросах защиты от невалидных значений не является аргументом как раз неопределённость. Тем более когда вместо типа подсовывается синтаксический прибамбас на простом целом.

                                  Добавлено
                                  К тому же это определено.
                                  ExpandedWrap disabled
                                    enum EN{q=0, w=1, e=2};
                                    union
                                    {
                                     int x;
                                     EN en;
                                    };
                                    t=44;
                                    switch (en)
                                    {
                                     case q:
                                     case e:
                                     case r: return true;
                                     default: return false;
                                    }
                                  должен вернуть фолз.
                                  Сообщение отредактировано: Ирокез -
                                    Цитата Ирокез @
                                    В вопросах защиты от невалидных значений
                                    Этой защитой в плюсах занимается программист. Задача компилятора - создать максимально быстрый код минимального размера, удовлетворяющий требованиям стандарта. Вы пообещали компилятору, что переменная этого типа будет содержать одно из четырех указанных значений - будьте добры это обеспечить.
                                    Цитата Ирокез @
                                    А по-твоему какова разрядность базового типа? 1 бит?
                                    А по-вашему какова? 8 бит? Или 16? А может 24? Или 64?
                                      Цитата Dushevny @
                                      Этой защитой в плюсах занимается программист.
                                      А я прям не в курсе.

                                      Добавлено
                                      Цитата Dushevny @
                                      Вы пообещали компилятору, что переменная этого типа будет содержать одно из четырех указанных значений - будьте добры это обеспечить.
                                      Лож. Ничего я ему не обещал. Я потребовал, чтоб количество осмысленных значений равнялось количеству перечисленных имён. О бессмысленных значениях не сказав ему ни слова.

                                      Добавлено
                                      Цитата Dushevny @
                                      А по-вашему какова? 8 бит? Или 16? А может 24? Или 64?
                                      Минимум 32.

                                      Добавлено
                                      Цитата Dushevny @
                                      одно из четырех указанных значений - будьте добры это обеспечить.
                                      А ничего, что это не возможно?

                                      Добавлено
                                      Не путайте с паскалем, где перечисление обязано гарантировать не производительность кода и не его размер, а невозможность иных значений. На плюсах не только каждое обращение не приводится к вычислению остатка от деления на общее количество перечисленных имён, но и сами коды могут быть произвольными и между ними могут быть дыры.
                                      Сообщение отредактировано: Ирокез -
                                        Цитата Ирокез @
                                        Лож. Ничего я ему не обещал. Я потребовал, чтоб количество осмысленных значений равнялось количеству перечисленных имён. О бессмысленных значениях не сказав ему ни слова.

                                        В стандарте языка нет понятия бессмысленных значений в перечислениях. Если ты перечисление используешь нестандартным способом - это явный признак плохой архитектуры твоей программы. Научись использовать преимущества языка, а не искать на свой отладчик приключений :lol:
                                          Цитата JoeUser @
                                          В стандарте языка нет понятия бессмысленных значений в перечислениях.
                                          Вот именно. Следовательно, стандарт их даже запретить не может.

                                          Добавлено
                                          Цитата JoeUser @
                                          Если ты перечисление используешь нестандартным способом - это явный признак плохой архитектуры твоей программы. Научись использовать преимущества языка,
                                          И какое же преимущество мне даёт случайность значения неинициированной переменной?
                                          Цитата JoeUser @
                                          а не искать на свой отладчик приключений
                                          Так я и прописал проверку валидности.
                                            Цитата Ирокез @
                                            И какое же преимущество мне даёт случайность значения неинициированной переменной?

                                            При чем тут это? Использование переменной без предварительной инициализации - дурной тон. И ошибка в проектировании.

                                            Добавлено
                                            Цитата Ирокез @
                                            Следовательно, стандарт их даже запретить не может.

                                            В стандартной библиотеке есть функция прямой записи в память по адресу.
                                            Но это не означает, что правильно писать от балды куда, и от балды что.
                                            Типизация языка - это помощь программисту, а не защита от дурака.
                                              Эх, человека забанили. Злыдни <_<
                                              Вообще, всё зависит от того, чем является чтение невалидного enum-а. Если это unspecified behavior, то компилятор не должен эту функцию до return true редуцировать. Если же это undefined, то редуцирование будет более чем логичным.
                                                Цитата Ирокез @
                                                Ты б хоть потестил. Перечисление может принимать любые значения своего базового типа, независимо от того, назначены им имена или нет.
                                                Ты б хоть Стандарт почитал. Это перечисление может хранить только 4 элемента.

                                                Добавлено
                                                Цитата Ирокез @
                                                К тому же это определено.
                                                ...
                                                А это тоже 4 элемента. Для него default имеет смысл.

                                                Добавлено
                                                Цитата Ирокез @
                                                Минимум 32.
                                                2 бита.

                                                Добавлено
                                                OpenGL, unspecified.
                                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                0 пользователей:


                                                Рейтинг@Mail.ru
                                                [ Script execution time: 0,0627 ]   [ 17 queries used ]   [ Generated: 23.04.24, 11:35 GMT ]