clone 范式用于制作派生类的拷贝,而无需向下转换为基类类型。不幸的是,clone
必须在每个子类中实现(或与 CRTP 混合)。
C++11 的 decltype
是否有可能使这变得不必要?
我不认为下面的代码实际上复制 original
,而只是指向它的引用。当我尝试使用 new decltype(*original)
时,出现错误:error: new cannot be applied to a reference type
。clone
仍然是 C++11 的方法吗?或者是否有一些新方法可以使用 RTTI 从基类指针复制派生类对象?
#include <iostream>
struct Base
{
virtual void print()
{
std::cout << "Base" << std::endl;
}
};
struct Derived : public Base
{
int val;
Derived() {val=0;}
Derived(int val_param): val(val_param) {}
virtual void print()
{
std::cout << "Derived " << val << std::endl;
}
};
int main() {
Base * original = new Derived(1);
original->print();
// copies by casting down to Base: you need to know the type of *original
Base * unworking_copy = new Base(*original);
unworking_copy->print();
decltype(*original) on_stack = *original;
on_stack.print();
return 0;
}
最佳答案
decltype
是一个静态结构。与所有 C++ 类型构造一样,它无法推断对象的运行时类型。 decltype(*original)
只是 Base&
。
关于c++ - C++11 的 decltype 是否使克隆变得不必要?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10424337/