1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
// traits de base : ne défini rien ; il est illégal de l'utiliser
template <class T>
struct color_traits
{ };
// spécialisé pour rgb_t
template <>
struct color_traits<rgb_t>
{
typedef int average_type;
average_type compute_average(const rgb_t& c)
{ return (int(c.r) + int(c.g) + int(c.b)) / 3; }
};
// spécialisé pour gray_t
template <>
struct color_traits<gray_t>
{
typedef int average_type;
average_type compute_average(const gray_t& c)
{ return int(c); }
};
template <class T, class Traits = color_traits<T> >
class color
{
public:
typedef color<T,Traits> self_type;
typedef Traits traits_type;
typedef T value_type;
private:
value_type m_color;
public:
static typename traits_type::average_type
compute_average(const self_type& c)
{
return traits_type::compute_average(c.m_color);
}
typename traits_type::average_type
compute_average()
{
return traits_type::compute_average(m_color);
}
}; |
Partager