我可以在C++中有一个带有未标记值的枚举吗?

Can I have an enum with unlabelled values in C++?

本文关键字:枚举 C++ 有一个 我可以      更新时间:2023-10-16

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

我尝试使用以下方法执行此操作:

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

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

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

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

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

您正在寻找内置的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

当然,完全有可能使值<>在很多方面不那么通用,更有用,但你并没有真正告诉我们你想要什么。

我的技术是

#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