我遇到了下面部分显示的这个模板化智能指针类 Cptr,但我不理解其中一个方法实现,希望得到一些输入。我的问题是关于下面标记的“方法 2”。具体来说,如果 Cptr 由 T 模板化,则可以使用哪些调用语法来调用“方法 2”,至少在我看来,它是一个复制构造函数,但我认为复制构造函数不是模板化的。
template <class T> class Cptr
{
public:
/* Constructors ... */
/* Getters ... */
T* ptr() const { return p_; }
long* cnt() const { return cnt_; }
/* Copy Constructors? */
//Method 1
Cptr<T>(const Cptr<T>& i)
: ptr_(i.ptr()), cnt_(i.ptr())
{
std::cout << "M1" << std::endl;
++(*cnt);
}
//Method 2
template <class S> Cptr(const Cptr<S>& i)
: ptr_(i.get()), cnt_(i.cnt())
{
std::cout << "M2" << std::endl;
++(*cnt_);
}
private:
T* p_;
int* cnt_;
};
int main(int argc, char* argv[])
{
CPtr<int> A(new int(5));
CPtr<int> B(A);
std::cout << *(B.get()) << std::endl;
return EXIT_SUCCESS;
}
我设想像这样调用方法 2:
Cptr<float> B( new float(1.1) );
Cptr<int> A(B); //error for different types
但是不同类型的指针赋值对我来说意义不大。有没有人遇到过像“方法 2”这样的方法定义,如果有,有什么用途?非常感谢您的宝贵时间。
最佳答案
首先,从广义上讲,复制构造函数当然可以是模板。从技术上讲,复制构造函数是来自同一类的另一个实例的构造函数,但您当然可以定义一个将对另一个类的引用作为参数的构造函数。
但是,您的主要方法的答案是“方法 2”允许将智能指针从智能指针分配给不同的类,只要允许隐式类型转换:
class Base {};
class Derived : public Base {};
Cptr<Derived> d;
Cptr<Base> b=d; // "Method2" will be used here.
此智能指针实现允许将指向派生类的智能指针分配给指向基类的智能指针。
通常,Cptr<Base>
和 Cptr<Derived>
是两个完全不相关的类。每个模板实例都是一个单独的类。并且您通常不能将一个类的实例分配给完全不相关的类的实例,除非可以进行适当的转换。
就像您可以将指向派生类的普通指针分配给指向基类的指针一样,此智能指针提供了类似的功能。
关于c++ - 模板类 "Copy Constructor",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41961993/