我正在设计一个RGB颜色表示的类。 它有三个属性:红色,绿色和蓝色。
到目前为止,我有 unsigned char int 类型的3个属性(从0到255)。我想使用C ++模板,所以我也可以使用其他类型,例如 float , double 或 int 。
但是,我需要知道最大值,这可能是用std :: numeric_limits解决的。问题是浮点数。它们应该在0..1范围内。你有什么想法来解决这个问题吗?
我的目标是将红色,绿色和蓝色从未知类型转换为数字0..1。
答案 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.
计算浮点值。