Есть ли способ указать конструктор по умолчанию для enum class
?User Defined C++ 11 enum class Default Constructor
Я использую enum class
, чтобы указать набор значений, допустимых для определенного типа данных в библиотеке: в этом случае это идентификационные номера GPIO-контактов малины Pi. Это выглядит примерно так:
enum class PinID : int {N4 = 4, N17 = 17, /* ...etc... */ }
Точка меня делать это вместо того, чтобы просто использовать, скажем, int
является обеспечение того, код безопасен: Я могу static_assert
(или в противном случае время компиляции обеспечения - фактический используемый метод не важен для меня), такие вещи, как то, что кто-то не произвел орфографическую ошибку (прохождение 5 вместо 4 и т. д.), и я получаю сообщения об ошибках автоматически для несоответствий типов и т. д.
проблема заключается в том, что enum class
имеет конструктор по умолчанию, который - для совместимости с C enum
s Предполагаю (поскольку они имеют такое же поведение) - инициализирует эквивалент enum class
0
. В этом случае нет значения 0
. Это означает, что пользователь делает заявление/определение типа:
PinID pid = PinID();
получает нумератор, который явно не определено (и даже, кажется, не «существует», когда один смотрит на код), и может привести к ошибкам во время выполнения. Это также означает, что методы, подобные switch
по значениям явно определенных счетчиков, невозможны без ошибки с ошибкой/по умолчанию - чего-то, чего я хочу избежать, поскольку он заставляет меня либо throw
, либо сделать что-то вроде возврата boost::optional
, которые меньше поддающийся статическому анализу.
Я попытался определить конструктор по умолчанию безрезультатно. Я (отчаянно) пытался определить функцию, которая разделяет имя enum class
, но это (довольно неудивительно) привело к странным ошибкам компилятора. Я хочу сохранить возможность отбрасывать enum class
до int
, со всеми перечислениями нумераторов N#
в соответствующие #
, поэтому просто «определение», скажем, N4 = 0 является неприемлемым; это для простоты и здравомыслия.
Я думаю, мой вопрос в два раза: есть ли способ получить статическую безопасность после использования enum class
? Если нет, какие другие возможности вы бы предпочли? То, что я хочу, это то, что:
- по умолчанию constructable
- можно сделать по умолчанию построить для произвольного действительного значения
- обеспечивает «конечное множество заданных» значения, обеспечиваемое
enum class
эс - является по крайней мере, типа безопасной как
enum class
- (предпочтительно) не включает в себя время выполнения полиморфизм
Причина, по которой я хочу конструктивную конструкцию по умолчанию, заключается в том, что я планирую использовать boost::lexical_cast
, чтобы уменьшить синтаксические служебные данные, связанные с преобразованиями между значениями enum class
и фактическими связанными string
s, которые я вывожу в операционную систему (в этом случае sysfs); boost::lexical_cast
требует конструктивности по умолчанию.
Ошибки в моих рассуждениях приветствуются - я начинаю подозревать, что enum class
es - это правильный объект для неправильной работы, в данном случае; разъяснение будет предложено, если его попросят. Спасибо за ваше время.
Просто глядя на это, он выглядит в основном хорошим, но будет ли он работать? У вас есть определение класса, которое включает в себя экземпляр себя как члена ... о, но они статичны. Тогда компилятор не сходит с ума. Умный медведь. – FizzixNerd
@FizzixNerd Я не запускал его, хотя компилятор, но он должен работать ... Я думаю, что если вы добавите потоковые операторы, вы сможете использовать его непосредственно с lexical_cast, я полагаю, бросаю исключение, если приходит недопустимое значение. – PeterSW
@PeterSW, можете ли вы указать, какие элементы в стандарте C++ 11 вы ссылаетесь, говоря об нулевой инициализации? –