如何使用模板来规范化 0 到 1 范围内的数字?

Posted

技术标签:

【中文标题】如何使用模板来规范化 0 到 1 范围内的数字?【英文标题】:How can I use templates to normalize number in range from 0 to 1? 【发布时间】:2014-04-10 15:28:51 【问题描述】:

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

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

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

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

【问题讨论】:

带有 std::is_floating_point 的模板特化,只接受 0 到 1 之间的值作为 RGB 值。 【参考方案1】:
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_;

【讨论】:

【参考方案2】:
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&lt;T&gt;::max() 计算为整数的最大值,1. 计算浮点值。

【讨论】:

以上是关于如何使用模板来规范化 0 到 1 范围内的数字?的主要内容,如果未能解决你的问题,请参考以下文章

设计一个 O(n) 算法来找到一个不在 [0,n-1] 范围内的数字 [重复]

如何在excel中生成一个在一定范围内的随机数

如何在 HSQLDB 中生成一个范围内的数字行列表?

如果给定的数据在使用 R 或 Python 的范围(-1 到 1)内,如何以 (-3 ,-2,-1,0,1,2,3) 格式规范化数据?

将一个范围内的数字转换为另一个范围内的数字[重复]

在VB中,如何生成某个范围内的随机整数?