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