std::static_pointer_cast(智能指针类型转换)

std::static_pointer_cast 是 C++11 引入的一个模板函数,用于将智能指针(例如 std::shared_ptrstd::weak_ptr)从一种类型强制转换为另一种类型。它与 static_cast 类似,但专门用于智能指针。

语法

std::shared_ptr<TargetType> std::static_pointer_cast<TargetType>(const std::shared_ptr<SourceType>& r);
  • TargetType:目标类型,指你希望将智能指针转换为的类型。
  • SourceType:源类型,指智能指针当前所指向的类型。
  • r:要转换的智能指针对象。
作用
  • 类型转换:将一个智能指针从一种类型转换为目标类型,类似于 static_cast 但用于智能指针。
  • 智能指针管理功能保留:转换后的指针仍然是智能指针,它保留了引用计数和自动管理内存的功能。

使用场景

  • 你知道对象的真实类型并且想要在不丢失智能指针管理功能的情况下对其进行转换。
  • 可以在继承层次中进行转换,如从基类智能指针向派生类智能指针的转换,或者在相关类型之间进行转换。

示例

1. 父类指针转换为子类指针

假设有一个父类 Base 和子类 DerivedBase 指针指向的是一个 Derived 对象,想将 std::shared_ptr<Base> 转换为 std::shared_ptr<Derived>

#include <iostream>
#include <memory>

class Base {
public:
    virtual void show() { std::cout << "Base class" << std::endl; }
};

class Derived : public Base {
public:
    void show() override { std::cout << "Derived class" << std::endl; }
};

int main() {
    // 创建 Derived 对象并将其指针存储在 shared_ptr<Base> 中
    std::shared_ptr<Base> base_ptr = std::make_shared<Derived>();

    // 将 Base 类型的智能指针转换为 Derived 类型
    std::shared_ptr<Derived> derived_ptr = std::static_pointer_cast<Derived>(base_ptr);

    // 通过 derived_ptr 调用 Derived 的方法
    derived_ptr->show(); // 输出:Derived class
}
2. 在相关类型之间进行转换
#include <iostream>
#include <memory>

class A {
public:
    virtual void print() { std::cout << "A" << std::endl; }
};

class B : public A {
public:
    void print() override { std::cout << "B" << std::endl; }
};

int main() {
    std::shared_ptr<A> ptrA = std::make_shared<B>();  // 将 B 对象存储为 A 类型的智能指针
    std::shared_ptr<B> ptrB = std::static_pointer_cast<B>(ptrA);  // 转换为 B 类型智能指针

    ptrB->print();  // 输出:B
}

dynamic_pointer_cast 的区别

  • std::static_pointer_cast:用于在你明确知道对象类型并且类型转换不会失败的情况下。它不检查对象是否真的能被转换,转换时必须是安全的。
  • std::dynamic_pointer_cast:用于在运行时进行类型检查。它可以在多态类型之间进行安全的类型转换,如果转换失败会返回 nullptr
示例
std::shared_ptr<Derived> derived_ptr = std::dynamic_pointer_cast<Derived>(base_ptr);

在这里,dynamic_pointer_cast 会在运行时检查 base_ptr 是否指向 Derived 类型的对象,只有在检查成功的情况下才会返回转换后的指针。

总结

  • std::static_pointer_cast 是用于智能指针类型间的编译时强制转换,不会在运行时进行检查。
  • 它的用法与 static_cast 类似,但不会丢失智能指针的内存管理功能。
  • 适用于继承层次中从基类指针转换为派生类指针的场景。

🎯 关键点:在使用 static_pointer_cast 时,确保类型转换是合法的,否则可能会导致未定义行为。

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值