检查枚举有效性

时间:2013-10-30 01:19:53

标签: 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;
...
}

对于小于X的值进行了类似的检查。

我看到编译器完全删除了检查。我有Google搜索的原因并且遇到了许多解释C ++中整数转换规则的页面,但我没有找到关于将枚举转换为整数或检查有效性的任何说明。

完成此任务的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

Y进行测试似乎是随意的,所以我会添加一些限制。这也允许您在最小和最大之间添加更多元素,而不关心排序。

enum abc 
{
    ABC_MIN = 0,
    X,
    Y,
    ABC_MAX
};

int my_class::set_abc(abc value)
{
    assert(value > ABC_MIN && value < ABC_MAX);
{

答案 1 :(得分:1)

由于01abc类型的唯一有效值,无论谁传入的值大于或小于已经调用的值都未定义行为,以创造它。

您不能轻易地用C ++编写代码来检测先前导致UB的条件 - 正如您所观察到的,编译器倾向于根据语言允许或禁止的内容进行优化。

你可以编写一个函数的int重载来检查该值,然后转换为枚举类型,而不是在abc重载中检查,因为它是别人的问题以避免调用UB。

或者,您可以通过在枚举中添加一些任意附加值来避免测试冗余。然后编译器无法将其删除。

答案 2 :(得分:0)

在C ++中,如果没有显式强制转换,则无法直接将整数分配给enum个变量。

如果您的代码在任何地方使用enum类型,那么就没有必要检查它是否有效。它应该从一开始就有效,并且应该保持有效。

但是,如果您的代码将值作为整数获取,并且您需要将其转换为enum(或者您可能对enum值执行某些算术运算),那么您应该验证该网站的价值。