我想在我的项目中使用observer_ptr
,但是paper只定义了接口,而不是完整的实现。
有没有一种简单的方法可以自己实现它?
您可以通过创建带有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
...没有花哨的名称。
如果你绝对必须拥有花哨的名字和/或一个独特的类型,那么自己实现它应该很容易。