模板类赋值运算符中的模板参数

Template Argument in Template-Class Assignment Operator

本文关键字:参数 赋值运算符      更新时间:2023-10-16

我正在尝试编写一个泛型类MyStack来实现堆栈。我的类中有一个模板变量,类型为 Data .我还重载了将现有MyStack对象复制到另一个现有MyStack对象= operator。因此,我想在复制之前检查两个类对象是否具有相同类型的变量,即我不希望将 float 类型的对象复制到 int 类型的对象。完成此任务的好方法是什么?

MyStack定义 :

template<typename Data>
class MyStack
{
    Data *data;
    int pos;
    int Max;
    MyStack();
    public:
    MyStack(int);
    int push(const Data);
    int push(const Data *,const Data);
    Data pop();
    Data* pop(const int);
    int getMaxSize();
    int currSize();
    int isEmpty();
    void display();
    MyStack(const MyStack &);
    void operator=(const MyStack s);
    ~MyStack();
};

这是运算符重载部分:

template<typename Data>
void MyStack<Data>::operator=(const MyStack s)
{
    cout<<"Copied with operator overloading"<<endl;
    delete[] data;
    data=new Data[s.Max];
    Max=s.Max;
    pos=s.pos;
    for(int i=0;i<=s.pos;i++)
            data[i]=s.data[i];
}

提前谢谢。

在声明中

void operator=(const MyStack s);

您有许多问题(请参阅重载特殊成员(:

  1. 返回类型应为 MyStack<Data> &
  2. s应该是一个常量引用。
  3. s应作为常量引用的类型也是MyStack<Data>的。

请注意,MyStack不是实际类型。这是一个"类型工厂"。

总的来说,它应该看起来像

MyStack<Data> &operator=(const MyStack<Data> &s);

这将顺便解决您的问题 - 它只需要对实例化到同一DataMyStack模板的常量引用。


如果您还想支持来自其他堆栈类型的分配,则可以考虑如下内容:

#include <type_traits>
template<typename Data>
class MyStack
{
...
    template<typename OtherData>
    typename std::enable_if<
        std::is_convertible<OtherData, Data>::value,
        MyStack<Data> &>::type
        operator=(const MyStack<OtherData> &other);
};

这使用:

  • std::is_convertible检查OtherData是否可以转换为Data

  • std::enable_if仅为类型定义它 转换为 Data .