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

时间:2011-05-17 01:23:13

标签: c++ enums

基本上我想将变量限制为值0,1或2.

我尝试过以下操作:

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

但这是一个编译错误,因为枚举值是未标记的。它只是使代码不太可读,分配名称如“ZERO”,“ONE”和“TWO”而不是将值称为0,1和2.有没有办法绕过这个或者我应该摆脱枚举并在其他地方执行该规则?

3 个答案:

答案 0 :(得分:1)

如果您想使用enum,则需要为其命名。由于您只是处理整数值,并且您显然希望它们实际上表示整数值,因此最好使用int参数,并在方法顶部进行快速检查。对欢迎指定此约束的方法发表评论。

请注意,如果您的值实际上与非数字设置相对应,那么您应该提出好的名称并使用enum

答案 1 :(得分:1)

仅仅因为您为值添加标识符并不意味着您必须使用它们...您可以使用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_;
};

答案 2 :(得分:0)

您正在寻找内置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&lt;&gt;在很多方面不那么通用,也更有用,但你并没有真正告诉我们你想要什么