Вы можете использовать шаблон для члена, чтобы избежать повторения:
template<class Depth>
struct ColorRGB
{
Depth R;
Depth G;
Depth B;
ColorRGB(const Depth& r, const Depth& b, const Depth& g) : R(r), G(g), B(b) {}
// Allow conversion between different depths.
template <class Depth2>
ColorRGB(const ColorRGB<Depth2>& rhs) :
R(rhs.R),
G(rhs.G),
B(rhs.B)
{
}
template <class Depth2>
ColorRGB& operator =(const ColorRGB<Depth2>& rhs)
{
R = rhs.R;
G = rhs.G;
B = rhs.B;
return *this;
}
ColorRGB(const ColorRGB& rhs) = default;
ColorRGB& operator =(const ColorRGB& rhs) = default;
};
Версия шаблона не обрабатывает конструктор копирования, но, к счастью, по умолчанию используется OK.