3 回答
TA贡献1874条经验 获得超12个赞
我将创建几个功能模板,static_unique_ptr_cast和dynamic_unique_ptr_cast。如果您完全确定指针实际上是a Derived *,请使用前者,否则请使用后者。
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());
}
该功能正在服用右值引用,以确保你没有从主叫方的脚下拉了地毯偷的unique_ptr传递给你。
- 3 回答
- 0 关注
- 793 浏览
添加回答
举报