我有一个类Base和一个派生类Derived。函数从文件描述符中读取对象并返回Base对象:
std::unique_ptr<Base> readNextThing();在某些地方,我需要将这个函数的返回值降到派生值。这是相关的,因为输入unique_ptr是一个rvalue引用,所以我们不复制指针,而是移动它。在这个特定的上下文中,如果对象不是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());发布于 2020-09-21 14:16:21
不幸的是,std::dynamic_pointer_cast doesn't work on unique_ptr -没有理由不能在rvalue unique_ptr上工作,只是在失败情况下的行为可能是不明显的。
如果这是一次性的情况,您可以通过std::shared_ptr,注意它有一个来自unique_ptr的隐式构造函数。
auto ptr = std::unique_ptr<Derived>(
std::dynamic_pointer_cast<Derived>(readNextThing()).release());但我认为你提议的效用函数更清晰。也许可以使用this solution中的
https://stackoverflow.com/questions/63993875
复制相似问题