有没有办法指定一个的默认构造函数enum class
?
我正在使用enum class
指定一组允许库中特定数据类型的值:在这种情况下,它是 Raspberry Pi 的 GPIO 引脚 ID 号。它看起来像这样:
enum class PinID : int {N4 = 4, N17 = 17, /* ...etc... */ }
我这样做而不是仅仅使用 an 的int
目的是确保代码是安全的:我可以static_assert
(或者编译时确保 - 使用的实际方法对我来说并不重要)像某人没有的事情出现拼写错误(传递 5 而不是 4 等),并且我收到类型不匹配等的自动错误消息。
那么问题是它enum class
有一个默认构造函数——为了与 C 的兼容性,enum
我假设(因为它们具有相同的行为)——初始化enum class
为0
. 在这种情况下,没有任何0
价值。这意味着用户做出如下声明/定义:
PinID pid = PinID();
正在获取一个未明确定义的枚举器(当人们查看代码时,它甚至似乎都不“存在”),并且可能导致运行时错误。这也意味着switch
在没有错误/默认情况的情况下,像对显式定义的枚举器的值进行 ing 这样的技术是不可能的——我想避免这种情况,因为它迫使我要么要么throw
做类似 return a 的事情boost::optional
,而这些事情不太适合静态分析。
我试图定义一个默认构造函数无济于事。我(拼命地)试图定义一个共享名称的函数enum class
,但这(毫不奇怪)导致了奇怪的编译器错误。我想保留转换 to 的能力enum class
,int
所有N#
枚举器都映射到它们各自的#
,所以仅仅“定义”,比如 N4 = 0 是不可接受的;这是为了简单和理智。
我想我的问题有两个:有没有办法获得我使用后的那种静态安全enum class
?如果不是,人们更喜欢哪些其他可能性?我想要的是:
- 是默认可构造的
- 可以将默认构造设置为任意有效值
- 提供由
enum class
es提供的“指定的有限集”值 - 至少与
enum class
- (最好)不涉及运行时多态性
我想要默认可构造性的原因是因为我计划使用它boost::lexical_cast
来减少值之间转换所涉及的语法开销,以及我输出到操作系统enum class
的实际关联s(在本例中为 sysfs);需要默认的可构造性。string
boost::lexical_cast
我的推理中的错误是受欢迎的——我开始怀疑enum class
es 是错误工作的正确对象,在这种情况下;如果被问到,将提供澄清。感谢您的时间。