类模板中的重载赋值运算符

Overloading assignment operator in a class template

本文关键字:重载 赋值运算符      更新时间:2023-10-16
#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<char*> Float;
#endif // NUMBER_HPP

此模板类分别使用两种数据类型进行初始化。 一个是 int 类型,另一个是 char 指针类型。

   typedef Number<int> Integer1,Integer2;
   typedef Number<char*> Char1,Char2;
   Integer2.setValue(2) ;
   Char2.setValue("ABC");
   Integer1 = Interger2;//Case 1
   Char1 = Char2; // Case 2

在案例 1 中:不需要深拷贝。

在案例 2 中:深拷贝是必须的,因为我们正在复制指针。

但是由于这两个类都使用相同的赋值运算符的基本副本。 我们如何实现这一目标?

请提出一个不包括C++ 11的解决方案。

也许你只是想重载你的operator=

template <class T2>
Number<T>& operator=( const Number<T2*>& number )
{
    // Deep Copy
}
template <class T2>
Number<T>& operator=( const Number<T2>& number )
{
    // Shallow Copy
}

在所有其他情况下,您可能希望std::enable_if根据类型静态决定应使用哪个副本策略(很可能它是否是指针类型,因此例如 std::is_pointer<T2>::value (。然后,这可以通过if constexpr(C++17(非常容易地简化:

#include <type_traits>
template <class T2>
Number<T>& operator=( const Number<T2>& number )
{
    if constexpr( std::is_pointer_v<T2> ){
        // Deep Copy
    }
    else{
        // Shallow Copy
    }
    return *this;
}

希望这有帮助!

我认为这就是你要找的。 您正在为T分配T2。 这意味着我们需要取一个Number<T2>,将值转换为T,然后分配给thisreturn *this

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