转换 stdshared ptr 指针
不可能在 std::shared_ptr
上直接使用 static_cast
,const_cast
,dynamic_cast
和 reinterpret_cast
来检索指针共享所有权,并将指针作为参数传递。相反,应该使用 std::static_pointer_cast
,std::const_pointer_cast
,std::dynamic_pointer_cast
和 std::reinterpret_pointer_cast
这两个函数:
struct Base { virtual ~Base() noexcept {}; };
struct Derived: Base {};
auto derivedPtr(std::make_shared<Derived>());
auto basePtr(std::static_pointer_cast<Base>(derivedPtr));
auto constBasePtr(std::const_pointer_cast<Base const>(basePtr));
auto constDerivedPtr(std::dynamic_pointer_cast<Derived const>(constBasePtr));
请注意,std::reinterpret_pointer_cast
在 C++ 11 和 C++ 14 中不可用,因为它仅由 N3920 提出并在 2014 年 2 月被采用到 Library Fundamentals TS 中 。但是,它可以实现如下:
template <typename To, typename From>
inline std::shared_ptr<To> reinterpret_pointer_cast(
std::shared_ptr<From> const & ptr) noexcept
{ return std::shared_ptr<To>(ptr, reinterpret_cast<To *>(ptr.get())); }