Можно ли указать конструктор по умолчанию для enum class
?
Я использую enum class
, чтобы указать набор значений, допустимых для определенного типа данных в библиотеке: в этом случае это идентификационные номера GPIO-контактов малины Pi. Это выглядит примерно так:
enum class PinID : int {N4 = 4, N17 = 17, /* ...etc... */ }
То, что я делаю это вместо использования, скажем, int
, должно гарантировать, что код безопасен: я могу static_assert
(или иначе обеспечить время компиляции - используемый фактический метод не важен для я) такие вещи, как, например, кто-то не произвел орфографическую ошибку (передавая 5 вместо 4 и т.д.), и я получаю сообщения об автоматической ошибке для несоответствий типов и т.д.
Проблема заключается в том, что enum class
имеет конструктор по умолчанию, который - для обеспечения совместимости с C enum
Я предполагаю (поскольку они имеют одинаковое поведение) - инициализирует эквивалент enum class
0
. В этом случае нет значения 0
. Это означает, что пользователь делает объявление/определение типа:
PinID pid = PinID();
получает перечислитель, который явно не определен (и даже не кажется "существующим", когда вы смотрите на код), и может привести к ошибкам во время выполнения. Это также означает, что такие методы, как switch
над значениями явно определенных счетчиков, невозможны без наличия случая ошибки/по умолчанию - чего-то, чего я хочу избежать, поскольку он заставляет меня либо throw
, либо делать что-то вроде return a boost::optional
, которые менее подвержены статическому анализу.
Я попытался определить конструктор по умолчанию безрезультатно. Я (отчаянно) пытался определить функцию, которая разделяет имя enum class
, но это (довольно неудивительно) привело к странным ошибкам компилятора. Я хочу сохранить возможность отбрасывать enum class
до int
, при этом все перечисляющие N#
перечисляющие их соответствующие #
, поэтому просто "определение", скажем, N4 = 0, неприемлемо; это для простоты и разумности.
Я думаю, мой вопрос в два раза: есть ли способ получить статическую безопасность после использования enum class
? Если нет, какие другие возможности вы бы предпочли? Я хочу что-то, что:
- по умолчанию конструктивен
- можно сделать конструкцией по умолчанию для произвольного допустимого значения
- предоставляет "конечный набор заданных" значений, предоставляемых
enum class
es - по крайней мере безопасен как тип
enum class
- (предпочтительно) не включает полиморфизм времени выполнения.
Причина, по которой я хочу конструктивную конструкцию по умолчанию, заключается в том, что я планирую использовать boost::lexical_cast
, чтобы уменьшить синтаксические накладные расходы, связанные с преобразованиями между значениями enum class
и фактическим ассоциированным string
, который я вывожу в операционную систему (sysfs in Это дело); boost::lexical_cast
требует конструктивности по умолчанию.
Ошибки в моих рассуждениях приветствуются - я начинаю подозревать, что enum class
es - это правильный объект для неправильной работы, в данном случае; разъяснение будет предложено, если его попросят. Спасибо за ваше время.