可以说我有课
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/