如何使用模板来标准化范围从0到1的数字?

时间:2014-04-10 15:28:52

标签: c++ templates

我正在设计一个RGB颜色表示的类。 它有三个属性:红色,绿色和蓝色。

到目前为止,我有 unsigned char int 类型的3个属性(从0到255)。我想使用C ++模板,所以我也可以使用其他类型,例如 float double int

但是,我需要知道最大值,这可能是用std :: numeric_limits解决的。问题是浮点数。它们应该在0..1范围内。你有什么想法来解决这个问题吗?

我的目标是将红色,绿色和蓝色从未知类型转换为数字0..1。

2 个答案:

答案 0 :(得分:2)

template<class T>
RGBClass {
public:
    RGBClass():
        max_value(std::numberic_limits<T>::max())
        /* ... */
    {}
    /* ... */
    const T max_value;

private:
    T R_;
    T G_;
    T B_;
};

template<>
RGBClass<float> {
public: 
    RGBClass():
        max_value(1),
        /* ... */
    {}

    // convert other type to float 0..1
    template<class OTHER_TYPE>
    RGBClass(const OTHER_TYPE& other):
        max_value(1),
        R_((float)other.R_ / (float)other.max_value),
        /* ... */
    {}
    const float max_value;

private:
    float R_;
    float G_;
    float B_;
}

答案 1 :(得分:0)

template<typename T, typename=void>
struct pixel_component_range {
  static constexpr T max() { return std::numberic_limits<T>::max(); }
};
template<typename F>
struct pixel_component_range<F, typename std::enable_if<std::is_floating_point<F>::value>::type>
{
  static constexpr T max() { return 1.f; }
};

现在pixel_component_range<T>::max()计算整数的最大值,1.计算浮点值。