Это можно сделать, но не с примитивами int
с.Вам нужно будет реализовать свой собственный тип класса, который перегружает различные арифметические операторы, чтобы они выглядели как int.Вот один из способов добиться этого:
#include <limits> // for numeric_limits
struct RangedInt {
private:
int m_min = std::numeric_limits<int>::min();
int m_max = std::numeric_limits<int>::max();
int m_val = 0;
public:
RangedInt(int value = 0) : m_val(value) {}
void setMinMax(int min, int max){
m_min = min;
m_max = max;
m_val = std::min(std::max(m_val, m_min), m_max);
}
// pre-increment
RangedInt& operator++(){
m_val++;
if (m_val > m_max) m_val = m_min;
return *this;
}
// post-increment
RangedInt operator++(int){
RangedInt tmp {*this}; // create temporary with old value
operator++(); // perform increment
return tmp; // return temporary
}
// pre-decrement
RangedInt& operator--(){
m_val--;
if (m_val < m_min) m_val = m_max;
return *this;
}
// post-decrement
RangedInt operator--(int){
RangedInt tmp {*this}; // create temporary with old value
operator--(); // perform decrement
return tmp; // return temporary
}
// this can be extended to implement the following operators
RangedInt operator+(const RangedInt& x);
RangedInt operator+(int x);
RangedInt operator-(const RangedInt& x);
RangedInt operator-(int x);
RangedInt& operator+=(const RangedInt& x);
RangedInt& operator+=(int x);
RangedInt& operator-=(const RangedInt& x);
RangedInt& operator-=(int x);
// and lots more, for *, /, unary +/-, etc...
// convenient conversion to int:
explicit operator int(){
return m_val;
}
};
Приведенный выше код теперь позволяет написать следующее:
RangedInt i = 9998;
i.setMinMax(-27135, 10000);
std::cout << (int)i << '\n'; // 9998
i++;
std::cout << (int)i << '\n'; // 9999
i++;
std::cout << (int)i << '\n'; // 10000
i++;
std::cout << (int)i << '\n'; // -27135
Этот метод может быть расширен с помощью шаблонов для работы с любым числовым типом ине только int
, но вы также можете превратить минимальные и максимальные значения в параметры шаблона, если они известны во время компиляции и занимает место в памяти.