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/

10-13 09:14