【问题标题】:How to make shared_ptr wrapper class work with make_shared如何使 shared_ptr 包装类与 make_shared 一起工作
【发布时间】:2015-05-18 10:25:51
【问题描述】:

这个问题延伸到Customising std::shared_ptr or boost::shared_ptr to throw an exception on NULL dereference

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

不过,我还想继续使用 make_shared。有没有办法让 make_shared 与我的(或任何)包装类 shared_ptr 一起工作?符合以下原则的东西

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

【问题讨论】:

  • 我猜想继承自 shared_ptr 并提供接受 shared_ptr&amp; 的构造函数和赋值运算符(用于复制和移动)。
  • 或者对包装器做同样的事情?并且也许将 make_shared 专门用于这种新类型?
  • @martin_pr,你不能编写函数模板的部分特化,你需要重载它(在你自己的命名空间中)。
  • @JonathanWakely 是的,很公平,我的错...

标签: c++ c++11 shared-ptr


【解决方案1】:

添加合适的构造函数

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

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&lt;T&gt; (std::shared_ptr&lt;U&gt;)) 的用法是让构造函数只有在可以将U* 转换为T* 时才参与重载解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2018-01-20
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多