c ++ передает все типы шаблонов оператору без указания всех типов - PullRequest
0 голосов
/ 28 октября 2018

первый раз.Можно ли передать все типы шаблонов оператору?Все операторы присваивания объектов __Depth перегружены, и им не приходится перегружать операторы цветовых каналов без необходимости записывать каждую глубину цвета и комбинации каналов.Спасибо заранее.

struct Depth8
    {
        unsigned char Depth;

        void operator =(const Depth16& _Depth)
        {
            Depth = 255 * _Depth.Depth / 65535;
        }
    };
    struct Depth16
    {
        unsigned short Depth;

        void operator =(const Depth8& _Depth)
        {
            Depth = 65535 * _Depth.Depth / 255;
        }
    };


template<class __Depth>struct ColorRGB
    {
        __Depth R;
        __Depth G;
        __Depth B;

        void    operator =(ColorBGR& _Color) // << Want to do this instead of..
        {
            R = _Color.R;
            G = _Color.G;
            B = _Color.B;
        }

void    operator =(ColorBGR<__Depth>& _Color) // << this..
            {
                R = _Color.R;
                G = _Color.G;
                B = _Color.B;
            }

void    operator =(ColorBGR<Depth16>& _Color) // << or this..
            {
                R = _Color.R;
                G = _Color.G;
                B = _Color.B;
            }
    };
        };

1 Ответ

0 голосов
/ 28 октября 2018

Вы можете использовать шаблон для члена, чтобы избежать повторения:

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.

...