C++ 检查枚举有效性
我有一个公开枚举的类。我试图检查setter函数中值的有效性,如下所示:C++ 检查枚举有效性,c++,enums,C++,Enums,我有一个公开枚举的类。我试图检查setter函数中值的有效性,如下所示: enum abc { X, Y }; int my_class::set_abc(abc value) { if(static_cast<int>(value) > static_cast<int>(Y)) return -1; ... } 枚举abc { X,, Y }; int my_class::set_abc(abc值) { 如果(静态施法(值)>
enum abc
{
X,
Y
};
int my_class::set_abc(abc value)
{
if(static_cast<int>(value) > static_cast<int>(Y))
return -1;
...
}
枚举abc
{
X,,
Y
};
int my_class::set_abc(abc值)
{
如果(静态施法(值)>静态施法(Y))
返回-1;
...
}
对于小于X的值,也有类似的检查
我看到编译器完全删除了检查。我之所以有Google的原因,并遇到了许多页解释C++中的整数转换规则,但我找不到任何关于将枚举转换为int或检查有效性的解释。
实现这一点的正确方法是什么?针对
Y
进行测试似乎是任意的,因此我要添加一些限制。这还允许您在最小值和最大值之间添加更多元素,而不必关心排序
enum abc
{
ABC_MIN = 0,
X,
Y,
ABC_MAX
};
int my_class::set_abc(abc value)
{
assert(value > ABC_MIN && value < ABC_MAX);
{
枚举abc
{
ABC_MIN=0,
X,,
Y
ABC_MAX
};
int my_class::set_abc(abc值)
{
断言(值>最小值和值<最大值);
{
由于
0
和1
是类型abc
的唯一有效值,因此任何传入大于或小于该值的值的人都已调用未定义的行为来创建它
<>你不能轻易地在C++中编写代码来检测先前引起UB的条件——正如你观察到的那样,编译器有一种倾向于基于语言允许或禁止的优化。
您可以编写函数的int
重载来检查值,然后转换为枚举类型,而不必麻烦检查abc
重载,因为避免调用UB是其他人的问题
可选的是,可以避免在枚举中添加任意的附加值,这样编译器就不能删除它。在C++中,
< P>,不能在没有显式转换的情况下直接将代码分配给<代码> EnUM < /C>变量。 如果您的代码在任何地方都使用了enum
类型,那么没有必要检查它是否有效。它应该从一开始就有效,并且应该保持有效
但是,如果您的代码以整数形式获取值,并且您需要将其转换为枚举
(或者您可能对枚举
值执行一些算术运算),那么您应该在该站点验证该值