首页 > 后端开发 > C++ > 如何安全地将基址的唯一指针向下转换为派生的唯一指针?

如何安全地将基址的唯一指针向下转换为派生的唯一指针?

Mary-Kate Olsen
发布: 2024-12-03 03:16:10
原创
485 人浏览过

How to Safely Downcast a Unique Pointer of Base to a Unique Pointer of Derived?

从基类的唯一指针向下转换为派生的唯一指针

当使用类层次结构和继承时,可能需要向下转换从基类到派生类的唯一指针以访问特定功能。当工厂方法返回指向基类的唯一指针但实际对象是派生类型时,通常会遇到这种情况。

要执行向下转换,通常建议遵循两步方法。首先,使用其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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板