То, что вы добавляете идентификаторы для значений, не означает, что вы должны их использовать ... вы можете использовать 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_;
};