#pragma once #include template inline std::shared_ptr static_pointer_cast(const std::shared_ptr &r) noexcept { auto p = static_cast::element_type *>(r.get()); return std::shared_ptr(r, p); } template inline std::shared_ptr dynamic_pointer_cast(const std::shared_ptr &r) noexcept { if (auto p = dynamic_cast::element_type *>(r.get())) { return std::shared_ptr(r, p); } else { return std::shared_ptr(); } } template inline std::shared_ptr const_pointer_cast(const std::shared_ptr &r) noexcept { auto p = const_cast::element_type *>(r.get()); return std::shared_ptr(r, p); }