基本上,我想把变量限制为0、1或2。我已经尝试过这样做了:
enum Value { 0, 1, 2 }; Value var;
但这是一个编译错误,因为枚举值是未标记的。它只会使代码的可读性降低,因为它指定了“ZERO”,“ONE”和“TWO”这样的名称,而不是引用值0,1和2。有什么方法可以解决这个问题吗?或者我应该摆脱枚举并在其他地方强制执行规则?
ergxz8rk1#
如果你想使用enum,那么你需要给它们命名。由于您只是处理整数值,并且显然希望它们实际上表示整数值,因此最好使用int参数,并在方法的顶部进行快速检查。欢迎对指定此约束的方法发表评论。请注意,如果您的值实际上对应于非数字设置,那么您应该使用好的名称并使用enum
enum
int
yqyhoc1h2#
为值添加标识符并不意味着必须使用它们……你可以使用Value(0),Value(2)等等。如果那样更方便的话,但是有一个危险:enum不会将存储的值限制为列出的值...例如,它不会保护您免受Value(3)的攻击。在结构体/类中,你可以使用位字段来限制数字的存储空间,但即使这样:- 范围必须对应于所请求的位数中可能的有符号或无符号值-尝试分配其他值将导致高阶位被移除,而不是任何类型的编译或运行时错误如果你的目的是创建一个独特的类型,强制限制值0到2,那么你需要一个具有专门构造函数和赋值运算符的类:
Value(0)
Value(2)
Value(3)
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_; };
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
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 };
打算像数字一样操作的枚举不会有任何其他标签。使用像min和max这样的泛型名称可以让读者知道这些名称不是枚举值的名义标签,并且还提示它们在允许的范围内。您还可以使用SFINAE来检测限制,而不必为每个枚举类型专门指定enum_traits。
min
max
enum_traits
4条答案
按热度按时间ergxz8rk1#
如果你想使用
enum
,那么你需要给它们命名。由于您只是处理整数值,并且显然希望它们实际上表示整数值,因此最好使用int
参数,并在方法的顶部进行快速检查。欢迎对指定此约束的方法发表评论。请注意,如果您的值实际上对应于非数字设置,那么您应该使用好的名称并使用
enum
yqyhoc1h2#
为值添加标识符并不意味着必须使用它们……你可以使用
Value(0)
,Value(2)
等等。如果那样更方便的话,但是有一个危险:enum
不会将存储的值限制为列出的值...例如,它不会保护您免受Value(3)
的攻击。在结构体/类中,你可以使用位字段来限制数字的存储空间,但即使这样:- 范围必须对应于所请求的位数中可能的有符号或无符号值-尝试分配其他值将导致高阶位被移除,而不是任何类型的编译或运行时错误
如果你的目的是创建一个独特的类型,强制限制值0到2,那么你需要一个具有专门构造函数和赋值运算符的类:
unguejic3#
您正在寻找内置
int
类型,AFAICT如果你真的想像Java程序员一样虔诚地使用ADT,你总是可以:
返回22
0sgqnhkj4#
我的技巧是
打算像数字一样操作的枚举不会有任何其他标签。
使用像
min
和max
这样的泛型名称可以让读者知道这些名称不是枚举值的名义标签,并且还提示它们在允许的范围内。您还可以使用SFINAE来检测限制,而不必为每个枚举类型专门指定
enum_traits
。