У меня есть класс enum с двумя значениями, и я хочу создать метод, который получает значение и возвращает другое. Я также хочу поддерживать безопасность типов (поэтому я использую класс enum вместо enum).
http://www.cplusplus.com/doc/tutorial/other_data_types/ ничего не упоминает о методах. Однако у меня сложилось впечатление, что класс любого типа может иметь методы.
enum class/struct
подтверждены?Ответы:
Нет, они не могут.
Я могу понять, что
enum class
часть для строго типизированных перечислений в C ++ 11 может показаться, что у вас тожеenum
естьclass
черты, но это не так. Мое обоснованное предположение заключается в том, что выбор ключевых слов был основан на шаблоне, который мы использовали до C ++ 11 для получения перечислений с определенными областями видимости:Однако это всего лишь синтаксис. Опять же ,
enum class
это неclass
.источник
union
это не то, что Джон Доу тоже считает классом . Тем не менее, они могут иметь функции-члены. И классы действительно не обязательны для функций-членов. Используя обозначение, подобноеvalue
илиthis
, что-то подобноеenum Size { Huge, Mega, Apocalypse; bool operator<(X rhs) const { return *this < rhs; }
(здесь также разрешающее;
), оно может иметь такой же смысл, как и другие формы функций.Хотя ответ «вы не можете» технически верен, я полагаю, что вы, возможно, сможете достичь желаемого поведения, используя следующую идею:
Я представляю, что вы хотите написать что-то вроде:
И вы надеялись, что код выглядит примерно так:
Но, конечно, это не работает, потому что у перечислений не может быть методов (и «это» ничего не значит в приведенном выше контексте)
Однако, если вы используете идею нормального класса, содержащего перечисление, не относящееся к классу, и одну переменную-член, которая содержит значение этого типа, вы можете быть очень близки к требуемой безопасности синтаксиса / поведения / типа. то есть:
Теперь вы можете написать:
И компилятор предотвратит такие вещи, как:
Вы можете легко добавить такие методы, которые:
и
может быть поддержано.
источник
Концентрируясь на описании вопроса вместо названия, возможный ответ
источник
Как уже упоминалось в другом ответе , нет. Даже
enum class
не класс.Обычно необходимо иметь методы для
enum
результатов по той причине, что это не обычное (просто возрастающее) перечисление, а своего рода побитовое определение значений, которые нужно замаскировать, или другие бит-арифметические операции:Очевидно, что для манипулирования таким набором «флагов» было бы полезно инкапсулировать необходимые операции для переустановки / установки одного / группы битов, например, с помощью значения битовой маски или даже операций с битовым индексом.
C ++ 11
struct
/class
спецификация просто поддерживает лучшую область видимости значений enum для доступа. Ни больше ни меньше!Способы выхода из ограничения, которые вы не можете объявить методами для перечислений (классов), это либо использовать
std::bitset
(класс-обертку), либо битовое полеunion
.union
s, и такие битовые союзы могут иметь методы (см здесь для ограничений!).У меня есть пример, как преобразовать значения битовой маски (как показано выше) в их соответствующие битовые индексы, которые можно использовать
std::bitset
здесь: BitIndexConverter.hppЯ нашел это довольно полезным для улучшения читаемости некоторых основанных на флаге дециссов алгоритмы.
источник
Существует довольно совместимая возможность (§) реорганизовать перечисление в класс без необходимости переписывать ваш код, что означает, что вы можете эффективно выполнять то, что просили, без слишком большого редактирования.
(§), как указывает ElementW в комментарии, зависимый от type_traits код работать не будет, поэтому, например, нельзя использовать auto и т. Д. Может быть какой-то способ обработки таких вещей, но в конце можно преобразовать перечисление в класс, и это всегда ошибка подорвать C ++
enum struct
иenum class
спецификация о обзорных так не части этого.Ваше оригинальное перечисление, например, «домашнее животное» (это только для примера!).
(1) Вы изменяете это, например, на petEnum (чтобы скрыть его от существующего кода).
(2) Вы добавляете новое объявление класса под ним (названное с оригинальным перечислением)
(3) Теперь вы можете добавлять любые классовые методы, которые вам нравятся, в класс вашего питомца. например. оператор строки
Теперь вы можете использовать, например, std :: cout ...
источник
pet
типа / экземпляра типа, будь то шаблоныauto
, илиdecltype
, это ломается, когда вы получаетеpetEnum
вместо этого.Он может не удовлетворять всем вашим потребностям, но с не входящими в него операторами вы все равно можете получить массу удовольствия. Например:
Это позволяет код как
источник