我可以在C++中有一个带有未标记值的枚举吗?
Can I have an enum with unlabelled values in C++?
基本上我想将变量限制为值 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
};
旨在像数字一样操作的枚举不会有任何其他标签。
使用min
和max
等通用名称可以让读者知道这些名称不是枚举值的名义标签,并提示它们在允许的范围内。
还可以使用 SFINAE 来检测限制,而不必为每个枚举类型专用化enum_traits
。
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- C++两个源文件之间共享的枚举的静态实例
- 打印没有铸件的枚举可以在C++中吗?
- 枚举成员与静态 int 成员?
- C++:枚举:错误:应使用标识符而不是"}"
- 带有 c++ 的枚举(输入检查)
- 在 qml 中使用 Q_ENUM 和 Q_PROPERTY 作为枚举类
- 为什么 int 类型的枚举类值不能用作 int
- 在 C++ 中输出枚举类类型的向量元素