C++模板类具有带模板的构造函数

C++ template class having constructor with template

本文关键字:构造函数 C++      更新时间:2023-10-16

所以我有一些基本类A,如下所示:

template<class T1>
class A {
public:
    X* x;
    template <class T2>
    A(const A<T2> &a) {
        x = new X(a->x);
    }
};

其中T1和T2都是从X继承的类型。然而,这段代码不起作用,我真的不明白我该如何编写它,以便构造函数能够使用另一个具有潜在不同模板参数的A

因此,为了明确起见,我想写一个构造函数,它将能够使用不同的模板参数来获取a。(代码按原样编译,模板部分似乎没有按我希望的方式工作)。

我想做的事情:(其中YZ都继承自X

A<Z> a1;
A<Y> a2(a1);

非常感谢您的帮助!

很抱歉,我以为我可以创建一个好的例子,而不必使用我的实际代码,但我似乎在语法上有点失败,所以这里是我真正的类削减了一点:

template <class T>
class Calendar {
private:
    Date *d;
public:
    template <class T2>
    Calendar(const Calendar<T2> &c) {
        d = new T(c.view_date_component());
    }
    Calendar();
    ~Calendar();
    const Date& view_date_component() const;
};
template <class T>
Calendar<T>::Calendar() {
    d = new T();
}
template <class T>
Calendar<T>::~Calendar() {
    delete d;
}
template <class T>
const Date& Calendar<T>::view_date_component() const {
    return *d;
}

首先,您还需要定义一个默认构造函数。其次,您必须使模板类成为自己的朋友才能访问私有成员变量x。第三,在模板构造函数中,您将a作为const引用传递。因此,您不能使用->(即箭头运算符)访问它的成员,而是使用.(即点运算符)访问。

template<class T1>
class A {
  X* x;
 public:
   A() = default;
   ^^^^^^^^^^^^^^
   template <class T2>
   A(const A<T2> &a) {
     x = new X(*(a.x));
               ^^^^^^
   }
  template<class T2> friend class A;
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
};

实时演示

如果您希望模板构造函数仅在T1T2继承自X时被调用:

template <typename T2, 
typename = typename std::enable_if<std::is_base_of<X, T1>::value && 
                                   std::is_base_of<X, T2>::value>::type>
A(const A<T2> &a) {
    x = new X(*(a.x));
}

实时演示

如果您想检查T2扩展X或扩展T1,您可以将SFINAE与std::is_base_of:一起使用

template <class T2, typename = std::enable_if_t<std::is_base_of<X, T2>>>
A(const A<T2> &a) {
    x = new X(a->x);
}