找出类及其子类中的类类型

时间:2012-08-22 16:27:00

标签: c++ boost shared-ptr

让我说我有班级

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()的定义是通用的,这样从子类(es)实例调用makeShared()会产生一个指向子类而不是父类的指针

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

1 个答案:

答案 0 :(得分: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