【问题标题】:Overloading assignment operator in a class template [closed]在类模板中重载赋值运算符[关闭]
【发布时间】:2017-05-25 09:02:05
【问题描述】:
#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 的解决方案。

【问题讨论】:

  • 所以,您可以为此进行模板专业化。
  • 这不仅仅是关于 char*。它可能有 int* 、 float* 以及自定义数据类型。
  • 限制自己使用具有值语义的东西作为临时参数

标签: c++


【解决方案1】:

也许你只是想超载你的operator='s:

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&lt;T2&gt;::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;
}

希望这会有所帮助!

【讨论】:

  • 谢谢,我正在寻找像 std::is_pointer 这样的术语。还有一件事,为什么我们需要使用 constexpr?
  • 您不必这样做,但这有时会简化事情。例如。你可以用它消除 std::enable_if's。
【解决方案2】:

我认为这就是您要寻找的。您将T2 分配给T。这意味着我们需要获取Number&lt;T2&gt;,将值转换为T,然后分配给thisreturn *this

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

  return *this;
}

【讨论】:

  • 不,我没有将 T1 的值分配给 T2。我的问题是,模板类可以用两种类型的数据类型进行初始化。一种是简单的 int,另一种是指针,例如 char* 或 int*(这两种类型都有不同的编译类)。如果它是用 char* 初始化的,我们需要做深拷贝,但如果它是由 int 完成的,则不需要深拷贝。我们如何执行此操作?
猜你喜欢
  • 2016-01-04
  • 1970-01-01
  • 2011-08-03
  • 2019-06-30
  • 2011-11-14
  • 2014-10-16
  • 1970-01-01
  • 2015-01-27
相关资源
最近更新 更多