首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将std::shared_ptr<Derived<T>>转换为std::shared_ptr<Base>

可以通过以下方式实现:

  1. 使用std::static_pointer_cast函数进行转换: std::shared_ptr<Derived<T>> derivedPtr = ...; // 原始的std::shared_ptr<Derived<T>>指针 std::shared_ptr<Base> basePtr = std::static_pointer_cast<Base>(derivedPtr);
  2. 这种方式适用于Derived是Base的派生类的情况,可以将Derived类型的指针转换为Base类型的指针。
  3. 使用std::dynamic_pointer_cast函数进行转换: std::shared_ptr<Derived<T>> derivedPtr = ...; // 原始的std::shared_ptr<Derived<T>>指针 std::shared_ptr<Base> basePtr = std::dynamic_pointer_cast<Base>(derivedPtr);
  4. 这种方式适用于Derived是Base的派生类的情况,可以将Derived类型的指针转换为Base类型的指针。与std::static_pointer_cast不同的是,std::dynamic_pointer_cast会在运行时检查指针的类型,如果类型不匹配,则返回空指针。
  5. 使用std::reinterpret_pointer_cast函数进行转换: std::shared_ptr<Derived<T>> derivedPtr = ...; // 原始的std::shared_ptr<Derived<T>>指针 std::shared_ptr<Base> basePtr = std::reinterpret_pointer_cast<Base>(derivedPtr);
  6. 这种方式可以将Derived类型的指针转换为Base类型的指针,但是不会进行类型检查,因此需要确保转换是安全的。

以上是将std::shared_ptr<Derived<T>>转换为std::shared_ptr<Base>的几种常用方式。在实际应用中,根据具体的情况选择适合的转换方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Effective C++:规定27:尽量少做动作的过渡

(3)reinterpret_cast(expression):试图运行低级转型(比如一个指向整数变量的指针转换为整数),实际动作及结果可能与编译器相关,因而减少了可移植性。...(4)static_cast(expression):隐式转换。注意尽管能够使非const类型转换为const。但反之不能(这个仅仅能由const_cast来完毕)。...{...}; class Derived : public Base{...}; Derived d; Base* pb = &d;//隐喻的derived*转换成Base* 在这里表明:单一的对象可能拥有一个以上的地址...这里我们仅仅是建立一个base class指针指向一个derived class对象,但有时候上述的两个指针值并不同样。...::vector> VPW; VPW winPtrs; for(VPW::iterator iter = winPtrs.begin();

22520

C++关键知识点梳理

左值引用&右值引用左值引用:常规引用,可支持取地址运算符&获取内存地址;右值引用:右值是临时对象、字面量等表达式,右值引用解决临时对象或函数返回值给左值对象时的深度拷贝;std::move:输入的左值或右值转换为右值引用类型的临终值...;避免额外的深度拷贝;templatetypename std::remove_reference::type&& move(T&& a) noexcept{ return...static_cast::type&&>(a);}std::forward:如果函数forward的实参的数据类型是左值引用,则返回类型为左值引用...( typename std::remove_reference::type& t ){ return static_cast(t);}template T&&...forward( typename std::remove_reference::type&& t ){ return static_cast(t);}const定义:不被改变的值使用

93930

现代C++之手写智能指针

下面我也模拟实现scoped_ptr的管理机制(实际上就是前面提到的禁止拷贝): template class scoped_ptr // noncopyable { public...::move(cl)); // ok uniqueunique } 小结: (1)我们需要了解子类向基类的隐式转换,通过移动构造函数变为带模板的移动构造函数,要明白两者共存情况与只有带模板的移动或者其他构造函数对编译器生成规则的影响...(1)下行转换,基类转换为子类,例如:智能指针转换类似于shape* 转换为circle* 使用dynamic_cast转换后,指针为空.此时资源还是被dptr2拥有,dptr1为0。...(3)上行转换,子类基类,例如:智能指针转换类似于circle*转换为shape*,此时引用技术为两者共享。等价于static_cast。.../ 子类基类 上行转换,安全!

2.8K10
领券