基本上我想将变量限制为值0,1或2.
我尝试过以下操作:
enum Value
{
0,
1,
2
};
Value var;
但这是一个编译错误,因为枚举值是未标记的。它只是使代码不太可读,分配名称如“ZERO”,“ONE”和“TWO”而不是将值称为0,1和2.有没有办法绕过这个或者我应该摆脱枚举并在其他地方执行该规则?
答案 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;在很多方面不那么通用,也更有用,但你并没有真正告诉我们你想要什么