怎么可以实现observer_ptr?

时间:2014-06-11 08:08:13

标签: c++ pointers smart-pointers

我想在我的项目中使用observer_ptr,但paper仅定义接口,而不是完整的实现。

有没有一种简单的方法可以自己实现它?

1 个答案:

答案 0 :(得分:17)

您可以通过创建带有NOP删除的observer_ptr来轻松创建所谓的unique_ptr

template<typename T>
struct nop_deleter
{
  void operator()(T*) const {}
};

template<typename T>
using observer_ptr = unique_ptr<T, nop_deleter>;

这仍然会有unique_ptr的行为,这意味着它只会移动,而您希望observer_ptr可以复制。这使我们更简单的实现:

template<typename T>
using observer_ptr = T*;

这可以满足您的一切需求。你可以称之为observer_ptr<int>而不是int *,因为后者当然是邪恶的。它是可复制的,在破坏时什么都不做。


我在上面的答案中是滑稽的,但希望它能证明observer_ptr除了具有与原始指针类型不同的名称之外没有多大用处。使用非拥有原始指针时没有错。

您可能会争辩observer_ptr传达意图,但该参数仅在您的代码库包含管理资源的原始指针实例时才有效。消除那些,然后原始指针将自动表示observer_ptr ...没有花哨的名称。


如果您绝对必须拥有花哨的名称和/或不同的类型,那么自己实施它应该很容易。