让我说我有班级
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类实例的指针 有什么想法吗?
答案 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
。