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> {
};

(C++ 11およびBoostで)とmakeShared混同される可能性があるため、かなり紛らわしい名前であることに注意してください。shared_from_thisメソッドのより一般的な名前は ですclone

于 2012-08-22T16:31:50.963 に答える