限制struct成员的值

Kha*_*yet 3 c++ c++11

我想创建一个存储颜色RGB值的简单结构.r,g和b应该是[0,1]中的双数.

struct Color 
{
  Color(double x): r{x}, g{x}, b{x} {
    if (r < 0.0) r = 0.0;
    if (r > 1.0) r = 1.0;
    if (g < 0.0) g = 0.0;
    if (g > 1.0) g = 1.0;
    if (b < 0.0) b = 0.0;
    if (b > 1.0) b = 1.0;
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有比使用if语句更好的方法?

Bar*_*rry 8

只需写一个功能来钳制:

double clamp(double val, double left = 0.0, double right = 1.0) {
    return std::min(std::max(val, left), right);
}
Run Code Online (Sandbox Code Playgroud)

并在构造函数中使用它:

Color(double x)
    : r{clamp(x)}
    , g{clamp(x)}
    , b{clamp(x)} 
{ }
Run Code Online (Sandbox Code Playgroud)


Rei*_*ica 5

您可以使用minmax理想地将它们组合成一个clamp函数:

template <class T>
T clamp(T val, T min, T max)
{
  return std::min(max, std::max(min, val));
}

struct Color
{
  Color(double x) : r{clamp(x, 0., 1.)}, g{clamp(x, 0., 1.)}, b{clamp(x, 0., 1.)}
  {}
};
Run Code Online (Sandbox Code Playgroud)