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