Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.129.19] |
|
Сообщ.
#1
,
|
|
|
enum EN{q, w, e, r}; EN t; (((int)t)!=0) 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; EN::operator bool enum class EN |
Сообщ.
#2
,
|
|
|
Оберни EN в класс или структуру, и перегружай что хочешь.
Будет тебе счастье. |
Сообщ.
#3
,
|
|
|
Цитата JoeUser @ Я с этого начал. Пишет, что оператор-член приведения должен принимать воид. Оберни EN в класс или структуру, и перегружай что хочешь. Будет тебе счастье. |
Сообщ.
#4
,
|
|
|
Естественно. Он же метод, у него есть this. Его и должен кастовать. Зачем ему параметры?
|
Сообщ.
#5
,
|
|
|
Ирокез, странный у тебя свич. Любой каст приведет к true.
Добавлено Цитата Ирокез @ что оператор приведения должен быть чиьм-то не статическим членом Правильно пишет - в перечислениях нет методов. Но можно реализовать класс/структуру/объединение со схожим функционалом, и там будет возможна перегрузка. Стандартное перечисление в лоб не расширить. |
Сообщ.
#6
,
|
|
|
Цитата Qraizer @ Должен он привести перечисление. Естественно. Он же метод, у него есть this. Его и должен кастовать. Зачем ему параметры? Добавлено Цитата JoeUser @ default к false. странный у тебя свич. Любой каст приведет к true. Добавлено Цитата JoeUser @ Как? Но можно реализовать класс/структуру/объединение со схожим функционалом, и там будет возможна перегрузка. |
Сообщ.
#7
,
|
|
|
Цитата Ирокез @ default к false. Так да default'а дело никогда не дойдет, ибо все возможные значения кастуются к true. |
Сообщ.
#8
,
|
|
|
Цитата Ирокез @ Как? Примерно вот так: #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; } |
Сообщ.
#9
,
|
|
|
Цитата JoeUser @ Ну как же все, когда defalut к false? Так да default'а дело никогда не дойдет, ибо все возможные значения кастуются к true. |
Сообщ.
#10
,
|
|
|
Цитата Ирокез @ когда defalut к false А вот так. Если все возможные значения приводят с true, то до default дело не дойдет никогда. Вообще никогда. Совсем совсем, вообще вообще, никогда |
Сообщ.
#11
,
|
|
|
А вот вопрос, кстати - имеет ли право оптимизатор в этом случае заменить эту функцию на return true?
|
Сообщ.
#12
,
|
|
|
Цитата OpenGL @ С какого перепугу? Скорей уж оптимизатор обязан заменить А вот вопрос, кстати - имеет ли право оптимизатор в этом случае заменить эту функцию на return true? p!=nullptr true Добавлено Цитата JoeUser @ Ну как же все, когда всего три, из более, чем как минимум четырёх миллиардов? А вот так. Если все возможные значения приводят с true, то до default дело не дойдет никогда. Вообще никогда. |
Сообщ.
#13
,
|
|
|
Цитата Ирокез @ чем как минимум четырёх миллиардов? Каких еще миллиардов? Указанное перечисление может принимать одно из четырех значений, которые и перечислены в switch. Иного быть не может, значит и до default дело не дойдет. |
Сообщ.
#14
,
|
|
|
А по-твоему какова разрядность базового типа? 1 бит?
Добавлено Цитата JoeUser @ Бред. Ты б хоть потестил. Перечисление может принимать любые значения своего базового типа, независимо от того, назначены им имена или нет. Указанное перечисление может принимать одно из четырех значений, которые и перечислены в switch. Иного быть не может, значит и до default дело не дойдет. Добавлено Цитата JoeUser @ Гарантированно дойдёт. Дойдёт ли до остальных четырёх? Вот в чём вопрос. И я уже выбросил енам и полностью заменил его классом. Вместо членов перечисления статические константные экземпляры-члены, единственное поле (данное-член) – приватный указатель на экземпляр, конструктор по умолчанию копирует в него значение this, а присваивание и конструктор копий копируют туда удрес из копируемого объекта. Привидение к bool сравнивает адрес с адресами всех константных статических экземпляров-членов. Скормить свичу не получится, но пока это и не нужно. значит и до default дело не дойдет. |
Сообщ.
#15
,
|
|
|
Цитата Ирокез @ Бред. Ты б хоть потестил. В плюсах "работает" не является аргументом поскольку в нём есть UB |
Сообщ.
#16
,
|
|
|
Цитата OpenGL @ Не смешно. В вопросах защиты от невалидных значений не является аргументом как раз неопределённость. Тем более когда вместо типа подсовывается синтаксический прибамбас на простом целом. В плюсах "работает" не является аргументом поскольку в нём есть UB Добавлено К тому же это определено. 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; } |
Сообщ.
#17
,
|
|
|
Цитата Ирокез @ Этой защитой в плюсах занимается программист. Задача компилятора - создать максимально быстрый код минимального размера, удовлетворяющий требованиям стандарта. Вы пообещали компилятору, что переменная этого типа будет содержать одно из четырех указанных значений - будьте добры это обеспечить. В вопросах защиты от невалидных значений Цитата Ирокез @ А по-вашему какова? 8 бит? Или 16? А может 24? Или 64? А по-твоему какова разрядность базового типа? 1 бит? |
Сообщ.
#18
,
|
|
|
Цитата Dushevny @ А я прям не в курсе. Этой защитой в плюсах занимается программист. Добавлено Цитата Dushevny @ Лож. Ничего я ему не обещал. Я потребовал, чтоб количество осмысленных значений равнялось количеству перечисленных имён. О бессмысленных значениях не сказав ему ни слова.Вы пообещали компилятору, что переменная этого типа будет содержать одно из четырех указанных значений - будьте добры это обеспечить. Добавлено Цитата Dushevny @ Минимум 32. А по-вашему какова? 8 бит? Или 16? А может 24? Или 64? Добавлено Цитата Dushevny @ А ничего, что это не возможно? одно из четырех указанных значений - будьте добры это обеспечить. Добавлено Не путайте с паскалем, где перечисление обязано гарантировать не производительность кода и не его размер, а невозможность иных значений. На плюсах не только каждое обращение не приводится к вычислению остатка от деления на общее количество перечисленных имён, но и сами коды могут быть произвольными и между ними могут быть дыры. |
Сообщ.
#19
,
|
|
|
Цитата Ирокез @ Лож. Ничего я ему не обещал. Я потребовал, чтоб количество осмысленных значений равнялось количеству перечисленных имён. О бессмысленных значениях не сказав ему ни слова. В стандарте языка нет понятия бессмысленных значений в перечислениях. Если ты перечисление используешь нестандартным способом - это явный признак плохой архитектуры твоей программы. Научись использовать преимущества языка, а не искать на свой отладчик приключений |
Сообщ.
#20
,
|
|
|
Цитата JoeUser @ Вот именно. Следовательно, стандарт их даже запретить не может. В стандарте языка нет понятия бессмысленных значений в перечислениях. Добавлено Цитата JoeUser @ И какое же преимущество мне даёт случайность значения неинициированной переменной? Если ты перечисление используешь нестандартным способом - это явный признак плохой архитектуры твоей программы. Научись использовать преимущества языка, Цитата JoeUser @ Так я и прописал проверку валидности. а не искать на свой отладчик приключений |
Сообщ.
#21
,
|
|
|
Цитата Ирокез @ И какое же преимущество мне даёт случайность значения неинициированной переменной? При чем тут это? Использование переменной без предварительной инициализации - дурной тон. И ошибка в проектировании. Добавлено Цитата Ирокез @ Следовательно, стандарт их даже запретить не может. В стандартной библиотеке есть функция прямой записи в память по адресу. Но это не означает, что правильно писать от балды куда, и от балды что. Типизация языка - это помощь программисту, а не защита от дурака. |
Сообщ.
#22
,
|
|
|
Эх, человека забанили. Злыдни
Вообще, всё зависит от того, чем является чтение невалидного enum-а. Если это unspecified behavior, то компилятор не должен эту функцию до return true редуцировать. Если же это undefined, то редуцирование будет более чем логичным. |
Сообщ.
#23
,
|
|
|
Цитата Ирокез @ Ты б хоть Стандарт почитал. Это перечисление может хранить только 4 элемента. Ты б хоть потестил. Перечисление может принимать любые значения своего базового типа, независимо от того, назначены им имена или нет. Добавлено Цитата Ирокез @ А это тоже 4 элемента. Для него default имеет смысл. К тому же это определено. ... Добавлено Цитата Ирокез @ 2 бита. Минимум 32. Добавлено OpenGL, unspecified. |