我可以在C++中使用未标记值的枚举吗?

lsmd5eda  于 2023-07-01  发布在  其他
关注(0)|答案(4)|浏览(96)

基本上,我想把变量限制为0、1或2。
我已经尝试过这样做了:

enum Value
{
    0,
    1,
    2
};
Value var;

但这是一个编译错误,因为枚举值是未标记的。它只会使代码的可读性降低,因为它指定了“ZERO”,“ONE”和“TWO”这样的名称,而不是引用值0,1和2。有什么方法可以解决这个问题吗?或者我应该摆脱枚举并在其他地方强制执行规则?

ergxz8rk

ergxz8rk1#

如果你想使用enum,那么你需要给它们命名。由于您只是处理整数值,并且显然希望它们实际上表示整数值,因此最好使用int参数,并在方法的顶部进行快速检查。欢迎对指定此约束的方法发表评论。
请注意,如果您的值实际上对应于非数字设置,那么您应该使用好的名称并使用enum

yqyhoc1h

yqyhoc1h2#

为值添加标识符并不意味着必须使用它们……你可以使用Value(0)Value(2)等等。如果那样更方便的话,但是有一个危险:enum不会将存储的值限制为列出的值...例如,它不会保护您免受Value(3)的攻击。
在结构体/类中,你可以使用位字段来限制数字的存储空间,但即使这样:- 范围必须对应于所请求的位数中可能的有符号或无符号值-尝试分配其他值将导致高阶位被移除,而不是任何类型的编译或运行时错误
如果你的目的是创建一个独特的类型,强制限制值0到2,那么你需要一个具有专门构造函数和赋值运算符的类:

template <int MIN, int MAX>
class Bound
{
  public:
    explicit Bound(int n) { *this = n; }

    Bound& operator=(int n)
    {
        if (n < MIN or n > MAX)
            throw std::runtime_error("out of bounds");
        n_ = n;
        return *this;
    }
    Bound& operator+=(int n) { *this = n_ + n; }

    // should "+" return int or Bound?  entirely usage dependent...
    Bound operator+(int n) { return Bound(n_ + n); }

    // -=, -, *=, *, /=, /, %=, %, bitwise ops, pre/post ++/-- etc...

    operator int() const { return n_; }

  private:
    int n_;
};
unguejic

unguejic3#

您正在寻找内置int类型,AFAICT
如果你真的想像Java程序员一样虔诚地使用ADT,你总是可以:

template <typename ordinal=int>
struct Value
{
    ordinal _val;
    /*implicit*/ Value(ordinal val) : _val(val) {}
    /*implicit*/ operator const ordinal&() const { return _val; }
    /*implicit*/ operator       ordinal&()       { return _val; }
};

int main()
{
    Value<> x = 3;
    int y = x;
    x = y;

    x += 17;
    x++;

    return x;
}

返回22

  • 当然,完全可以在许多方面降低Value<>的通用性并使其更有用,但您并没有真正告诉我们您想要使用它做什么 *
0sgqnhkj

0sgqnhkj4#

我的技巧是

#if (defined(min) || defined(max))
#error This isn't the 1990s.  Don't define macros like this.
#endif

enum class MyEnum
{
  min=0,
  max=2
};

打算像数字一样操作的枚举不会有任何其他标签。
使用像minmax这样的泛型名称可以让读者知道这些名称不是枚举值的名义标签,并且还提示它们在允许的范围内。
您还可以使用SFINAE来检测限制,而不必为每个枚举类型专门指定enum_traits

相关问题