如何使模板重载复制构造函数?

How to make a template overload the copy constructor?

提问人:Blind Guardian 提问时间:8/13/2021 最后编辑:YksisarvinenBlind Guardian 更新时间:8/13/2021 访问量:69

问:

在尝试使用模板函数作为复制构造函数时,(我该怎么做)我只想出了 3 个解决方案:

结构 A:

template <typename D> A(const D&) {};

A(A& f)  : A(const_cast<const A&>(f)  {};

但是,如果我从这个函数继承,它们将有一个非 const-reference 默认复制构造函数。

反之亦然:

template <typename D> A(D&) {};

A(const A& f)  : A(const_cast<A&>(f)  {};

将避免对常量正确性的静态检查。

我试过了,但我不知道如何参数化构造函数,所以我想到了。但这是不可接受的,因为调用方编译的代码有责任添加 0 默认参数。<-- 这是另一个问题,如何在没有模板参数推导的情况下对构造函数进行参数化?template <typename D, int> A(D&) {};<typename D> A(D&, int e=0) {};

我想把它封装在一个(constexpr)类中,但对于这么简单的事情来说,污染太多了?.

请注意,制作单独的函数不起作用,因为它错过了初始值设定项。我想通过更改模板来更改复制构造函数,在可能不同的文件中。

C++ 模板 重载 default-copy-constructor

评论

2赞 HolyBlackCat 8/13/2021
复制构造函数(和移动构造函数以及复制/移动赋值)不能是模板,句点。我不确定你为什么要一个非常量引用作为参数。
0赞 Phil1970 8/13/2021
让常规构造函数和模板构造函数同时调用第三个(私有)构造函数(带有额外的参数)。它们都应该有参数,不应该有.const &const_cast

答: 暂无答案