【问题标题】:dynamic_cast a rvalue-reference unique_ptr?dynamic_cast 一个右值引用 unique_ptr?
【发布时间】:2025-12-02 10:20:06
【问题描述】:

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

std::unique_ptr<Base> readNextThing();

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

我能做到:

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);
}

std::unique_ptr<Derived> d = dynamic_unique_cast<Derived>(readNextThing());
  1. 是否有执行此操作的内置函数?
  2. 如果发生异常,上述代码是否存在内存泄漏风险?

【问题讨论】:

    标签: c++11 unique-ptr dynamic-cast


    【解决方案1】:

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

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

    auto ptr = std::unique_ptr<Derived>(
        std::dynamic_pointer_cast<Derived>(readNextThing()).release());
    

    但我认为你提出的效用函数更清晰。也许使用来自this solution 的那个?

    【讨论】:

      最近更新 更多