На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Как привести перечисление к типу?
    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
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0435 ]   [ 16 queries used ]   [ Generated: 29.03.24, 02:21 GMT ]