更优雅地克隆派生类型

时间:2014-09-30 14:12:10

标签: c++ templates clone

我有一个纯虚基类和几个派生类,我需要克隆派生的类。我最初这样做了:

struct base {
   virtual base* clone() = 0;
}

struct derived: public base {
   base* clone() {
      derived* d = new derived;
      /*copy members, etc.*/
      return d;
   }
}

这很好用,除了返回的类型(它是派生类型之一)之外,我所有派生类中的clone函数实现都是IDENTICAL。换句话说,我在克隆过程中所做的所有操作都是基类共有的。所以,我接下来要做的是在我的基类中添加一个模板函数:

struct base {
   virtual base* clone() = 0;

   template <typename T>
   T* make_clone() {
      T* d = new T;
      /*copy members, etc.*/
      return d;
   }
}

struct derived: public base {
   base* clone() {return base::make_clone<derived>();}
}

这也有效,但它似乎有点不优雅,我觉得应该有一个更简洁的方法,更少的函数调用和消除所有派生类中的单行函数。是否有一些语言功能或设计模式,我可以用它来清理这一点?另外,为了澄清,调用者不知道它需要克隆的base*的派生类型。否则我可以直接拨打base::make_clone<derived>

1 个答案:

答案 0 :(得分:1)

您可以使用CRTP

template <typename Derived>
struct derived_base : base
{
    Derived* clone()
    {
        Derived* x = new Derived;
        // ...
        return x;
    }
};

struct derived : derived_base<derived> {}
相关问题