Перегрузка оператора присваивания в шаблоне класса, который может быть приведен к другому типу шаблона. - PullRequest
7 голосов
/ 29 ноября 2011
#ifndef NUMBER_HPP
#define NUMBER_HPP

template <class T>
class Number
{
public:
  Number( T value ) : m_value( value )
  {
  }

  T value() const
  {
    return m_value;
  }

  void setValue( T value )
  {
    m_value = value;
  }

  Number<T>& operator=( T value )
  {
    m_value = value;
  }

  //  template <class T2>
  //  Number<T2>& operator=( const Number<T>& number )
  //  {
  //    m_value = number.value();

  //    return *this;
  //  }

private:
  T m_value;
};

typedef Number<int> Integer;
typedef Number<float> Float;
typedef Number<double> Double;

#endif // NUMBER_HPP

Перегрузка закомментированного оператора присваивания - это моя попытка сделать то, что я хочу, я подумал, что это может дать лучшее описание, чем приведенное над фрагментом.

Я хочу иметь возможность сделать следующее:

Float a(10);
Integer b(20);

a = b;

Где a тогда будет приведено к int и задано значение b, но все равно будет экземпляром класса Number.

Возможно ли это? Вы можете помочь мне здесь?

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 29 ноября 2011

Вы должны сделать это:

template <class T2>
Number<T>& operator=( const Number<T2>& number )
{
    m_value = number.value();
    return *this;
}

То есть используйте T2 в типе параметра, а не в типе возвращаемого значения!

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

template <class U>
Number<T>& operator=( const Number<U>& number )
{
    m_value = number.m_value; //I would also directly access the member variable!
    return *this;
}

Я думаю, что лучше использовать явное приведение, если вы хотите использовать тип класса какаргумент шаблона и конструктор которого был объявлен explicit:

 m_value = static_cast<T>(number.m_value); 

Кстати, другой operator= должен быть реализован как:

Number<T>& operator=(T const & value ) //accept by const reference
{
    m_value = value;
    return *this; //you've to return!
}
4 голосов
/ 29 ноября 2011

У вас есть некоторые из T в неправильном месте.Это должно быть

template <class T2>
Number<T>& operator=( const Number<T2>& number )
{
    m_value = number.value();
    return *this;
}

Это позволит вам сделать

Integer a(4);
Float b(6.2f);

a = b;

cout << a.value() << endl;

, и будет напечатано 6, поведение, подобное поведению типов int и floatподражают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...