首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dynamic_cast a rvalue-reference unique_ptr?

dynamic_cast a rvalue-reference unique_ptr?
EN

Stack Overflow用户
提问于 2020-09-21 14:01:11
回答 1查看 315关注 0票数 1

我有一个类Base和一个派生类Derived。函数从文件描述符中读取对象并返回Base对象:

代码语言:javascript
复制
std::unique_ptr<Base> readNextThing();

在某些地方,我需要将这个函数的返回值降到派生值。这是相关的,因为输入unique_ptr是一个rvalue引用,所以我们不复制指针,而是移动它。在这个特定的上下文中,如果对象不是Derived子类型,我不介意被销毁的对象,我只需要检测到在这种情况下下向指针是空的。

我可以做:

代码语言:javascript
复制
template<typename T, typename U>
std::unique_ptr<T> dynamic_unique_cast(std::unique_ptr<U> && unique)
{
    T * t = dynamic_cast<T*>(unique.get());
    if(t) { unique.release(); }  //Transfer ownership
    return std::unique_ptr<T>(t);
}

代码语言:javascript
复制
std::unique_ptr<Derived> d = dynamic_unique_cast<Derived>(readNextThing());

  1. 是否有内置函数来执行此操作?如果发生异常,
  2. 是否有发生上述代码内存泄漏的风险?
EN

回答 1

Stack Overflow用户

发布于 2020-09-21 14:16:21

不幸的是,std::dynamic_pointer_cast doesn't work on unique_ptr -没有理由不能在rvalue unique_ptr上工作,只是在失败情况下的行为可能是不明显的。

如果这是一次性的情况,您可以通过std::shared_ptr,注意它有一个来自unique_ptr的隐式构造函数。

代码语言:javascript
复制
auto ptr = std::unique_ptr<Derived>(
    std::dynamic_pointer_cast<Derived>(readNextThing()).release());

但我认为你提议的效用函数更清晰。也许可以使用this solution中的

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

https://stackoverflow.com/questions/63993875

复制
相关文章

相似问题

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