从基类的唯一指针向下转换为派生的唯一指针
当使用类层次结构和继承时,可能需要向下转换从基类到派生类的唯一指针以访问特定功能。当工厂方法返回指向基类的唯一指针但实际对象是派生类型时,通常会遇到这种情况。
要执行向下转换,通常建议遵循两步方法。首先,使用其release()方法从唯一指针释放该对象。这会释放底层资源并返回指向派生类对象的原始指针。其次,使用函数将原始指针转换为所需的派生类,并将其重新分配给新的唯一指针。
以下是执行安全向下转换的 CastToDerived() 函数的示例:
template<typename Derived, typename Base> std::unique_ptr<Derived> CastToDerived(Base* obj) { return std::unique_ptr<Derived>(static_cast<Derived*>(obj)); }
此函数可用于从基类唯一指针向下转换为派生类唯一指针指针:
unique_ptr<Derived> ptr = CastToDerived(DerivedAFactory());
或者,如果静态转换不可靠,您可以使用以下函数模板,它们根据向下转换的类型安全性执行静态或动态转换:
template<typename Derived, typename Base, typename Del> std::unique_ptr<Derived, Del> static_unique_ptr_cast( std::unique_ptr<Base, Del>& p ) { auto d = static_cast<Derived *>(p.release()); return std::unique_ptr<Derived, Del>(d, std::move(p.get_deleter())); } template<typename Derived, typename Base, typename Del> std::unique_ptr<Derived, Del> dynamic_unique_ptr_cast( std::unique_ptr<Base, Del>& p ) { if(Derived *result = dynamic_cast<Derived *>(p.get())) { p.release(); return std::unique_ptr<Derived, Del>(result, std::move(p.get_deleter())); } return std::unique_ptr<Derived, Del>(nullptr, p.get_deleter()); }
这些函数确保资源被正确处理,并使用适当的删除器函数构造唯一指针。
以上是如何安全地将基址的唯一指针向下转换为派生的唯一指针?的详细内容。更多信息请关注PHP中文网其他相关文章!