可以说我有课

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()将提供一个指向Parent类实例的指针
有任何想法吗?

最佳答案

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

关于c++ - 找出类(class)及其子级中的类(class)类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12077471/

10-11 18:59