如何设置整数的最小值/最大值,其中“++”和“-`”和一般数学遵循C++中设置的限制?
我不想在代码中乱扔一大堆if语句,而是想知道一个干净的方法来设置整数的限制,当迭代这些限制时,它仍然会包装它的值 那么比如说,如何设置整数的最小值/最大值,其中“++”和“-`”和一般数学遵循C++中设置的限制?,c++,integer,operator-overloading,integer-overflow,C++,Integer,Operator Overloading,Integer Overflow,我不想在代码中乱扔一大堆if语句,而是想知道一个干净的方法来设置整数的限制,当迭代这些限制时,它仍然会包装它的值 那么比如说, int i(9998); setMinMax(i,-27315, 10000); // Absolute Zero - Boiling Point of water i++; // == 9999 i++; // == 10000 i++; // == -27315 如果最小-最大值可以是动态的,那将是理想的。我不介意创建一个新类型,或者操作符重载。我只是想避免做
int i(9998);
setMinMax(i,-27315, 10000); // Absolute Zero - Boiling Point of water
i++; // == 9999
i++; // == 10000
i++; // == -27315
如果最小-最大值可以是动态的,那将是理想的。我不介意创建一个新类型,或者操作符重载。我只是想避免做这样的事情:
int i = foo();
int j = bar();
int min(-27315);
int max(10000);
i += j;
if (i==min-1) {i=max}
else if (i==max+1) {i=min}
else if (i>max) {i=min+(i-max)}
// more stupid code
谢谢。这可以做到,但不能用原始整数。您需要实现自己的类类型,该类类型重载各种算术运算符,以便看起来和感觉像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,如果编译时已知最小值和最大值,并且需要考虑内存占用,则还可以将其转换为模板参数。这是可以做到的,但不能使用基本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,如果在编译时已知最小值和最大值,并且内存占用是一个问题,则还可以将其转换为模板参数。您可能想看看Jonathan Müller的type_safe and associated。它提供了一个框架来完成您在这里寻找的许多其他事情 你可能想看看乔纳森·穆勒(Jonathan Müller)的type_保险柜和关联保险柜。它提供了一个框架来完成您在这里寻找的许多其他事情问题是关于C++,请不要标记,因为问题是关于C++的,请不要标记为欢迎。它对我来说是如此清晰,我不认为我需要详细说明。不客气。它对我来说是如此清晰可见,我不认为我需要详细说明。