轉換 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())); }