首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“下播”unique_ptr<Base> to unique_ptr<Derived>

“下播”unique_ptr<Base> to unique_ptr<Derived>
EN

Stack Overflow用户
提问于 2014-01-16 22:53:07
回答 1查看 29K关注 0票数 67

我有一系列返回unique_ptr<Base>的工厂。但是,在幕后,它们提供指向各种派生类型的指针,如unique_ptr<Derived>unique_ptr<DerivedA>unique_ptr<DerivedB>等。

考虑到DerivedA : DerivedDerived : Base,我们将拥有:

代码语言:javascript
复制
unique_ptr<Base> DerivedAFactory() {
    return unique_ptr<Base>(new DerivedA);
}

我需要做的是将指针从返回的unique_ptr<Base>“转换”到某个派生级别(不一定是原始的内部级别)。要用伪代码进行说明:

代码语言:javascript
复制
unique_ptr<Derived> ptr = static_cast<unique_ptr<Derived>>(DerivedAFactory());

我正在考虑通过从unique_ptr中释放对象来做到这一点,然后使用一个函数来转换原始指针并将其重新分配到另一个具有所需风格的unique_ptr (调用之前调用方将显式地执行release ):

代码语言:javascript
复制
unique_ptr<Derived> CastToDerived(Base* obj) {
    return unique_ptr<Derived>(static_cast<Derived*>(obj));
}

这是有效的,还是会有什么奇怪的事情发生?

PS。更复杂的是,一些工厂驻留在在运行时动态加载的DLL中,这意味着我需要确保在创建对象时在相同的上下文(堆空间)中销毁产生的对象。所有权的转移(通常发生在另一个上下文中)必须从原始上下文中提供一个删除者。但是,除了必须与指针一起提供/强制转换删除项之外,转换问题也应该是相同的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-16 23:23:26

我会创建几个函数模板,static_unique_ptr_castdynamic_unique_ptr_cast。在绝对确定指针实际上是Derived *的情况下使用前者,否则使用后者。

代码语言:javascript
复制
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());
}

这些函数采用一个rvalue引用,以确保您不会窃取传递给您的unique_ptr,从而使调用者的脚下不再有问题。

票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21174593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档