将整数限制为边界

时间:2017-01-08 17:28:29

标签: c++ max min clamp

我正在尝试确保int x大于或等于0但小于1080(在这种情况下是屏幕尺寸)。

我想出了这个

int x = 123;
x = std::min(std::max(x, 0), 1080);

这看起来很难看。有没有更好的方法来实现这一目标?

4 个答案:

答案 0 :(得分:8)

如果您将来居住,可以使用std::clamp from C++17

x = std::clamp(x, 0, 1080);

答案 1 :(得分:2)

天真的解决方案看起来也不错:

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);

答案 2 :(得分:1)

使用unsigned作为x的类型。这会自动将其限制为非负面。

然后你只需要调用std :: min,这对我来说至少是可口的。

构建一个在构造上采用int并且将转换运算符设置为int的类也是合理的,但需要相当多的样板。

答案 3 :(得分:-1)

为什么不做这样的事情?

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.