0

可以说我有课

template<typename PointT>
class Parent {
  public:
  typedef boost::shared_ptr<Parent<PointT> > Ptr;

  inline Ptr
  makeShared ()
  {
    return Ptr (new Parent<PointT> (*this));
  }
};

template<typename PointT>
class Child : public Parent {
  public:
    typedef boost::shared_ptr<Child<PointT> > Ptr;
};

现在我想将 Ptr 和 makeShared() 的定义重写为通用的,以便从子类实例调用 makeShared() 将产生指向子类而不是父类的指针

为了更清楚,在任何继承 Parent 的类上调用 makeShared() 都会给出一个指向该继承类实例的指针。并在父类上调用 make shared() 会给出一个指向父类实例的指针有什么想法吗?

4

1 回答 1

2

CRTP 将在这里工作:

template<typename Child>
class Parent {
  public:
  typedef boost::shared_ptr<Child> Ptr;

  inline Ptr
  makeShared ()
  {
    return Ptr (new Child(*static_cast<Child *>(this)));
  }
};

template<typename PointT>
class Child : public Parent<Child> {
};

请注意,这makeShared是一个相当混乱的名称,因为它可能会与shared_from_this(在 C++11 和 Boost 中)混淆。您的方法更典型的名称是clone.

于 2012-08-22T16:31:50.963 回答