首页
学习
活动
专区
工具
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();

    24220

    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定义:不被改变的值使用

    96030
    领券