轉換 stdshared ptr 指標

不可能在 std::shared_ptr 上直接使用 static_castconst_castdynamic_castreinterpret_cast 來檢索指標共享所有權,並將指標作為引數傳遞。相反,應該使用 std::static_pointer_caststd::const_pointer_caststd::dynamic_pointer_caststd::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())); }