现在是否有observer_ptr的实现?

Uni*_*rsE 5 c++ pointers smart-pointers

我想observer_ptr在我的项目中使用,但本文只定义了界面,而不是完整的实现.现在是否有开源实现,或者我必须自己完成?

Pra*_*ian 17

您可以observer_ptr通过unique_ptr使用NOP删除器创建一个所谓的平凡创建.

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

template<typename T>
using observer_ptr = unique_ptr<T, nop_deleter>;
Run Code Online (Sandbox Code Playgroud)

这仍然会有unique_ptr行为,这意味着它只是移动,而你想要observer_ptr是可复制的.这使我们更简单的实现:

template<typename T>
using observer_ptr = T*;
Run Code Online (Sandbox Code Playgroud)

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


我在上面的答案中很滑稽,但希望它能证明observer_ptr除了具有与原始指针类型不同的名称之外没有多少实用性.有什么错在使用非所属原始指针.

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


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

  • 我认为observer_ptr的一个必需功能是它的接口与其他标准智能指针兼容(有重置,交换,获取,可能发布等方法) (4认同)
  • @lisyarus是的,界面与其他智能指针一致,也许有时你需要它.但是我还没有想到在不知道所有权语义的情况下通常在智能指针类型上操作的需要.但我敢肯定,一个人为的例子可以用来制作有用的地方.实际上,实用程序仍然相当有限. (2认同)
  • 与使用智能指针类型相比,`using`方法的一个缺点是,这不会使`observer_ptr`变量初始化为零.虽然它仍然是一个很好的技术. (2认同)