提问人:prestokeys 提问时间:5/3/2022 更新时间:5/4/2022 访问量:106
每个派生类的复制构造函数
Copy constructor for every derived class
问:
请考虑以下代码。我希望该函数无需在每个具体派生类型中定义复制构造函数即可工作。
只有当它不是抽象的,但它是抽象的时,它才能以所示的方式在中间类中完成。那么在这种情况下,我该如何让它工作呢?convert
T(const Base&)
Base
CRTP<T>
struct Base {
virtual void foo() = 0;
};
template <typename T>
struct CRTP : virtual Base {
CRTP (const Base& base) : Base(base) { }
CRTP() = default;
// virtual void foo() override { } // CRTP<T> is abstract.
};
struct Derived1 : CRTP<Derived1> {
Derived1 (const Base& base) : Base(base) { }
Derived1() = default;
virtual void foo() override { }
};
struct Derived2 : CRTP<Derived1> {
Derived2 (const Base& base) : Base(base) { }
Derived2() = default;
virtual void foo() override { }
};
template <typename T, typename U>
T* convert (const U& u) {
// return new T(u); // This works, but only if T(const Base&) constructor is defined in every Base concrete derived type.
return dynamic_cast<T*>(new CRTP<T>(u)); // This only works if CRTP<T> is not abstract.
}
int main() {
Derived1 d1;
Derived2* d = convert<Derived2, Derived1>(d1);
}
答:
0赞
kasos5000
5/4/2022
#1
但是,事实上,它不是一个复制构造函数,所以它可以简单地像这样委托:
struct Derived1 : CRTP<Derived1> {
using CRTP<Derived1>::CRTP;
Derived1() = default;
virtual void foo() override {
}
};
您也可以使用指针而不是引用,顺便说一下,这似乎与您的代码更相关,因为 convert() 返回一个指针。此类构造函数不被视为复制构造函数,并且始终可以委托给子级。
评论
T(const Base&)
T(T&)
T(const T&)
T(volatile T&)
T(const volatile T&)
virtual std::unique_ptr<Base> clone() const;
auto p = q->clone();