如何使包装类shared_ptr make_shared一起使用
How to make shared_ptr wrapper class work with make_shared
此问题扩展了自定义 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
构造函数
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何将AERT_Allocate与 std:vector 一起使用
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 将GoogleMock与Boost::Shared Pointers一起使用时泄漏的Mock对象