【发布时间】: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());
- 是否有执行此操作的内置函数?
- 如果发生异常,上述代码是否存在内存泄漏风险?
【问题讨论】:
标签: c++11 unique-ptr dynamic-cast