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

std::dynamic_pointer_cast

Defined in header <memory>

template< class T, class U > std::shared_ptr<T> static_pointer_cast( const std::shared_ptr<U>& r );

(1)

(since C++11)

template< class T, class U > std::shared_ptr<T> dynamic_pointer_cast( const std::shared_ptr<U>& r );

(2)

(since C++11)

template< class T, class U > std::shared_ptr<T> const_pointer_cast( const std::shared_ptr<U>& r );

(3)

(since C++11)

template< class T, class U > std::shared_ptr<T> reinterpret_pointer_cast( const std::shared_ptr<U>& r );

(4)

(since C++17)

创建一个新的实例。std::shared_ptr其存储的指针是从r%27s使用强制转换表达式存储指针。如果r是空的,新的也是空的shared_ptr%28但其存储的指针不一定为空%29。

否则,新的shared_ptr将与r,但如果dynamic_castdynamic_pointer_cast返回空指针。

Ytypenamestd::shared_ptr<T>::element_type,然后产生的std::shared_ptr%27s存储的指针将通过按%29的顺序调用%28获得:

1%29static_cast<Y*>(r.get())...

2%29dynamic_cast<Y*>(r.get())%28如果结果为dynamic_cast为空指针值,则返回shared_ptr将为空%29。

3%29const_cast<Y*>(r.get())...

4%29reinterpret_cast<Y*>(r.get())

这些函数的行为是未定义的,除非U*T*结构良好:

1%29行为是未定义的,除非static_cast<T*>((U*)nullptr)都是很完美的。

2%29行为是未定义的,除非dynamic_cast<T*>((U*)nullptr)都是很完美的。

3%29行为是未定义的,除非const_cast<T*>((U*)nullptr)都是很完美的。

4%29行为是未定义的,除非reinterpret_cast<T*>((U*)nullptr)都是很完美的。

参数

r

-

The pointer to convert

例外

noexcept规格:

noexcept

注记

表达std::shared_ptr<T>(static_cast<T*>(r.get())),,,std::shared_ptr<T>(dynamic_cast<T*>(r.get()))std::shared_ptr<T>(const_cast<T*>(r.get()))可能具有相同的效果,但它们都可能导致未定义的行为,尝试删除同一对象两次%21

可能的实施

第一版

*。

模板<T类,类U>STD::Shared[医]PTR<T>静态[医]指针[医]CAST%28 Const STD::Shared[医]PTR<U>&r%29 no,{AUTO p=静态[医]CAST<TypeName STD::Shared[医]PTR<T>*要素[医]类型%2A>%28r.get%28%29%29;返回std::Shared[医]PTR<T>%28r,p%29;}

第二版

模板<T类,类U>STD::Shared[医]PTR<T>动态[医]指针[医]CAST%28 Const STD::Shared[医]PTR<U>&r%29 no,{if%28 AUTO p=Dynamic[医]CAST<TypeName STD::Shared[医]PTR<T>*要素[医]类型%2A>%28r.get%28%29%29%29{返回std::Shared[医]PTR<T>%28r,p%29;}{返回STD::Shared[医]PTR<T>%28%29;}

第三版

模板<T类,类U>STD::Shared[医]PTR<T>康斯特[医]指针[医]CAST%28 Const STD::Shared[医]PTR<U>&r%29 no,{autop=const除外[医]CAST<TypeName STD::Shared[医]PTR<T>*要素[医]类型%2A>%28r.get%28%29%29;返回std::Shared[医]PTR<T>%28r,p%29;}

二次

代码语言:javascript
复制
#include <iostream>
#include <memory>
 
struct BaseClass {};
 
struct DerivedClass : BaseClass
{
    void f() const
    {
        std::cout << "Hello World!\n";
    }
    ~DerivedClass(){ // note, it's not virtual
        std::cout << "~DerivedClass\n";
    }
};
 
int main()
{
    std::shared_ptr<BaseClass> ptr_to_base(std::make_shared<DerivedClass>());
 
    // ptr_to_base->f(); // Error won't compile: BaseClass has no member named 'f'
 
    std::static_pointer_cast<DerivedClass>(ptr_to_base)->f(); // OK
    // (constructs a temporary shared_ptr, then calls operator->)
 
    static_cast<DerivedClass*>(ptr_to_base.get())->f(); // also OK
    // (direct cast, does not construct a temporary shared_ptr)
}

二次

产出:

二次

代码语言:javascript
复制
Hello World!
Hello World!
~DerivedClass

二次

另见

(constructor)

constructs new shared_ptr (public member function)

代码语言:txt
复制
 © cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

扫码关注腾讯云开发者

领取腾讯云代金券