在类模板中重载赋值运算符,该类模板可以转换为另一个模板类型

mkr*_*man 7 c++ templates casting

#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
Run Code Online (Sandbox Code Playgroud)

注释赋值运算符重载是我尝试做我想要的,我认为它可能提供比片段上方更好的描述.

我希望能够做到以下几点:

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

a = b;
Run Code Online (Sandbox Code Playgroud)

a随后将被铸造成int并给予的价值b,但仍然是类的一个实例Number.

可能吗?你能帮帮我吗?

提前致谢.

Naw*_*waz 7

你应该做这个:

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

也就是说,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;
}
Run Code Online (Sandbox Code Playgroud)

我认为,如果你想使用类类型作为模板参数并且已经声明了其构造函数,最好使用显式强制转换explicit:

 m_value = static_cast<T>(number.m_value); 
Run Code Online (Sandbox Code Playgroud)

顺便说一下,另一个operator=应该实现为:

Number<T>& operator=(T const & value ) //accept by const reference
{
    m_value = value;
    return *this; //you've to return!
}
Run Code Online (Sandbox Code Playgroud)


Set*_*gie 5

你的一些Ts 放错了地方。它应该是

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

这会让你做

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

a = b;

cout << a.value() << endl;
Run Code Online (Sandbox Code Playgroud)

它会打印6,其行为类似于您正在模仿的intfloat类型。