限制整数范围
Limit integer to bounds
我试图确保 int x
大于或等于 0 但小于 1080(在本例中为屏幕尺寸)。
我想到了这个
int x = 123;
x = std::min(std::max(x, 0), 1080);
这看起来很难看。有没有更好的方法来实现这个?
使用无符号作为 x 的类型。这会自动将其约束为非负数。
然后你只剩下对 std::min 的调用,这至少对我来说是可以接受的。
构建一个 class 在构造时采用 int 并具有到 int 的转换运算符也是合理的,但需要相当多的样板文件。
以后如果住的话可以用std::clamp
from C++17:
x = std::clamp(x, 0, 1080);
为什么不做这样的事情呢?
int x = 123; /* Or some arbitrary number */
bool bIsInRange = (x >= 0) && (x < 1080);
if(!bIsInRange){
std::cout << "Variable 'x' is not between 0 and 1080." << std::endl;
return 1;
} // else, x is fine. Continue operations as normal.
天真的解决方案看起来不错:
int x = 123;
if (x < 0)
x = 0;
if (x > 1080)
x = 1080;
或将所有内容包装在一个函数中:
template<typename T>
T between(const T x, const T min, const T max){
if (x < min)
return min;
if (x > max)
return max;
return x;
}
int x = between(123, 0, 1080);
我试图确保 int x
大于或等于 0 但小于 1080(在本例中为屏幕尺寸)。
我想到了这个
int x = 123;
x = std::min(std::max(x, 0), 1080);
这看起来很难看。有没有更好的方法来实现这个?
使用无符号作为 x 的类型。这会自动将其约束为非负数。
然后你只剩下对 std::min 的调用,这至少对我来说是可以接受的。
构建一个 class 在构造时采用 int 并具有到 int 的转换运算符也是合理的,但需要相当多的样板文件。
以后如果住的话可以用std::clamp
from C++17:
x = std::clamp(x, 0, 1080);
为什么不做这样的事情呢?
int x = 123; /* Or some arbitrary number */
bool bIsInRange = (x >= 0) && (x < 1080);
if(!bIsInRange){
std::cout << "Variable 'x' is not between 0 and 1080." << std::endl;
return 1;
} // else, x is fine. Continue operations as normal.
天真的解决方案看起来不错:
int x = 123;
if (x < 0)
x = 0;
if (x > 1080)
x = 1080;
或将所有内容包装在一个函数中:
template<typename T>
T between(const T x, const T min, const T max){
if (x < min)
return min;
if (x > max)
return max;
return x;
}
int x = between(123, 0, 1080);