Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Задача с двумя параметризованными классами


Автор: AlexKar 7.12.2005, 19:08
Как реализовать такую задачу?
Есть два параметризованных класса:
template <class T>
class A{
---------
private:
T width;
};
template <class T>
class B{
---------
private:
T width;
};

Надо перегрузить оператор присваивания таким образом, чтобы
можно было выполнить следующее:

int main(void);
/* T1 и T2 - определенные типы, например int и float */
A<T1> a;
B<T2> b;
a=b; // Надо выполнить эти операции присваивания
b=a;
return 0;
}

Когда T1==T2 тогда все понятно:

template <class T>
class A{
public:
---------
void operator = (const B<T>&);
private:
T width;
};

template <class T>
void A<T>::operator = (const B<T>& rhs){
this->width=rhs.width;
}

Аналогично перегружаем = в классе B, но что делать,
если T1!=T2, как тогда перегрузить оператор = ?

template <class T>
class A{
public:
---------
template <class N>
void operator = (const B<N>&);
private:
T width;
};

template <class T,class N>
void A<T>::operator = (const B<N>& rhs){
this->width=rhs.width;
}


Над такой записью компилятор ругается, есть ли у вас какие-либо варианты;)

Автор: blackofe 7.12.2005, 19:51
AlexKar

вот такое компилится и работает:

Код

template <class T>
class B;

template <class T>
class A {
public:
    A(const T &Width) : width(Width) {}
    const A &operator =(const B<T> &rhs)        {    width = rhs.Width();
                                                    return *this; }
    template <class N>
    const A &operator =(const B<N> &rhs)        {    width = rhs.Width();
                                                    return *this; }
    const T &Width() const                        {    return width; }

private:
    T width;
};

template <class T>
class B {
public:
    B(const T &Width) : width(Width) {}
    const B &operator =(const A<T> &rhs)        {    width = rhs.Width();
                                                    return *this; }
    template <class N>
    const B &operator =(const A<N> &rhs)        {    width = rhs.Width();
                                                    return *this; }
    const T &Width() const                        {    return width; }

private:
    T width;
};

int main()
{
    A<int> a(10);
    B<long> b(20);

    cout << "a.width = " << a.Width() << endl;
    cout << "b.width = " << b.Width() << endl;

    a = b;

    cout << "a.width = " << a.Width() << endl;
    cout << "b.width = " << b.Width() << endl;

    b = a;

    cout << "a.width = " << a.Width() << endl;
    cout << "b.width = " << b.Width() << endl;

    return 0;
}


выдает на выходе:

a.width = 10
b.width = 20
a.width = 20
b.width = 20
a.width = 20
b.width = 20
Press any key to continue

то, что тебе нужно?

кстати, тебе только нужно позаботиться о возможности преобразования T в N и обратно. я выбрал int и long - понятно, что компилятор сделает необходимые приведения.

Автор: Earnest 8.12.2005, 20:02
Цитата(blackofe @ 7.12.2005, 19:51)
кстати, тебе только нужно позаботиться о возможности преобразования T в N и обратно.

... позаботится об этом тоже можно как-нибудь погибчее. Например, так:
Код

template <class _Res, class _Arg>
struct type_cast
{
   _Res operator ()(const Arg& a) const { return a; }
};

Соответственно, в коде оператора присваивания от blackofe вместо
Код

width = rhs.Width();
пишем
Код

width = type_cast<T,N>()(rhs.Width());

Для тривиальных случаев сойдет стандартная реализация type_cast, для более сложных - пишем необходимые специализации...

Автор: blackofe 8.12.2005, 20:40
Earnest
примерно это я и имел в виду.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)