怎么可以实现observer_ptr?

问题描述 投票:5回答:1

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

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

c++ pointers smart-pointers
1个回答
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 ...没有花哨的名称。


如果你绝对必须拥有花哨的名字和/或一个独特的类型,那么自己实现它应该很容易。

© www.soinside.com 2019 - 2024. All rights reserved.