如何使包装类shared_ptr make_shared一起使用

How to make shared_ptr wrapper class work with make_shared

本文关键字:shared 一起 make ptr 何使 包装类      更新时间:2023-10-16

此问题扩展了自定义 std::shared_ptr 或 boost::shared_ptr 以在 NULL 取消引用时引发异常。

我想要一个行为类似于shared_ptr的类,但在取消引用 nullptr 时会引发异常。在上面的问题中,建议创建一个包含shared_ptr的包装类,并让该包装器抛出异常。

但是,我也想继续使用make_shared。有没有办法make_shared与我(或任何)shared_ptr包装类一起工作?按照以下方式工作的东西

checked_shared_ptr<MyClass> csp = make_checked_shared<MyClass>(...);

添加合适的构造函数

最简单的解决方案是向template<class T> class checked_shared_ptr添加一个构造函数,以便可以用std::shared_ptr<T>初始化它,这将有效地使下面的编译(并执行预期的操作)。

checked_shared_ptr<MyClass> csp = std::make_shared<MyClass> (...);
<小时 />

示例实现

template<class T>
struct checked_shared_ptr {
  template<
    class U,
    class = decltype (std::shared_ptr<T> (std::shared_ptr<U> {}))
  > checked_shared_ptr (std::shared_ptr<U> const& src)
    : _sptr (src)
  { }
  // ...
  T& operator* () {
    if (_sptr)
      return *_sptr;
    throw std::runtime_error ("nullptr");
  }
  // ...
  std::shared_ptr<T> _sptr;
};

checked_shared_ptr<MyClass> csp = std::make_shared<MyClass> ();

注意

decltype(std::shared_ptr<T> (std::shared_ptr<U>)) 的用法是为了使构造函数仅在可以将U*转换为 T* 时才参与重载解析。

  • cppreference.com - shared_ptr构造函数