В основном я хочу ограничить переменные значениями 0, 1 или 2.
Я пробовал сделать это следующим образом:
enum Value
{
0,
1,
2
};
Value var;
Но это ошибка компиляции, потому что значения перечисления не помечены. Это просто делает код менее читаемым для присвоения имен, таких как «ZERO», «ONE» и «TWO», вместо того, чтобы ссылаться на значения как 0, 1 и 2. Есть ли способ обойти это или мне просто нужно избавиться от перечисления и обеспечить соблюдение правила в другом месте?
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_;
};
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
int
...?type MySmallInt is range 0 .. 2;
в ADA. Однако реализовать что-то подобное в C ++ довольно громоздко.ZERO, ONE, TWO
, перечисление все равно сможет содержатьONE | TWO
, то есть 3.