C++11 如何实施";动态“U型铸造”-共享ptr和x27之间的like运算符;s

C++11 如何实施";动态“U型铸造”-共享ptr和x27之间的like运算符;s,c++11,shared-ptr,dynamic-cast,C++11,Shared Ptr,Dynamic Cast,考虑从类B派生的类D,以及std::shared_ptr的sb实例。一旦我验证了dynamic_cast(sb.get())是可能的,我想从sb创建一个合适的std::shared_ptr。换句话说,我想在共享ptr之间实现一种dynami_cast。我怎样才能以干净的方式做到这一点?一个可能的解决方案是使B从std::enable_shared_from_this派生,并从指向D的(casted)指针使用shared_from_this()。但这需要改变B型的定义。有更好的想法吗?boost中

考虑从
类B
派生的
类D
,以及
std::shared_ptr
sb
实例。一旦我验证了
dynamic_cast(sb.get())
是可能的,我想从sb创建一个合适的
std::shared_ptr
。换句话说,我想在共享ptr之间实现一种
dynami_cast
。我怎样才能以干净的方式做到这一点?一个可能的解决方案是使B从
std::enable_shared_from_this
派生,并从指向
D
的(casted)指针使用
shared_from_this()
。但这需要改变B型的定义。有更好的想法吗?
boost
中是否有任何内容?

您是否知道
std::dynamic\u pointer\u cast


看这里:

正如其他答案所指出的,标准库已经提供了您想要的,但是为了完整性,实现它很容易:

template<typename To, typename From>
  std::shared_ptr<To>
  dynamic_pointer_cast(const std::shared_ptr<From>& from)
  {
    return std::shared_ptr<To>(from, dynamic_cast<To*>(from.get()));
  }
现在,如果强制转换失败,我们将返回一个空的
共享\u ptr
,这与
动态\u强制转换的行为更匹配

template<typename To, typename From>
  std::shared_ptr<To>
  dynamic_pointer_cast(const std::shared_ptr<From>& from)
  {
    if (auto p = dynamic_cast<To*>(from.get()))
      return std::shared_ptr<To>(from, p);
    return {};
  }