Mik*_*eir 1 c++ smart-pointers shared-ptr reinterpret-cast c++11
您有两个类Animal和Dog(其中Dog继承自Animal),并且您经常会遇到一种情况,您经常期待动物,但发送的是狗的实例。在我的特定情况下,我经常将强指针(std::shared_ptr<Dog>)投射到动物期望函数(std::shared_ptr<Animal>)。
如果我们接受我们可以将函数参数设置为引用(std::shared_ptr<Animal>&避免争论为什么不应该将强指针作为引用参数,因为担心更改线程的所有权),我认为我们在内存方面可以安全地强制转换std::shared_ptr<Dog> dog使用reinterpret_cast<std::shared_ptr<Animal>&>(dog),对吗?
如果是这样,除了线程问题之外还会出现什么问题?比如引用计数的变化?
需要明确的是,我们的目的是提供一种可在许多情况下使用的解决方案,在这些情况下,一次强制转换并不是真正可行的解决方案。更重要的是,有许多对象需要铸造。此外,忽略这一点std::unique_ptr可能是也可能不是更好的解决方案。
std::shared_ptr添加最后一个要求 -在通用序列化器类函数是虚拟的因此无法模板化的情况下,使用普通指针将不允许我更改原始指针。
由于不可能直接使用static_cast、const_cast和dynamic_castonreinterpret_cast来检索与作为参数传递的std::shared_ptr指针共享所有权的指针,因此应使用 、std::static_pointer_cast和函数。std::const_pointer_caststd::dynamic_pointer_caststd::reinterpret_pointer_cast
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())); }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7942 次 |
| 最近记录: |