如何使用模板来规范化 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++ 模板,所以我也可以使用其他类型,例如 float、double 或 int。
但是,我需要知道最大值,这可能可以用 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<T>::max()
计算为整数的最大值,1.
计算浮点值。
【讨论】:
以上是关于如何使用模板来规范化 0 到 1 范围内的数字?的主要内容,如果未能解决你的问题,请参考以下文章
设计一个 O(n) 算法来找到一个不在 [0,n-1] 范围内的数字 [重复]
如果给定的数据在使用 R 或 Python 的范围(-1 到 1)内,如何以 (-3 ,-2,-1,0,1,2,3) 格式规范化数据?