unique_ptr 自定义存储类型示例?

Posted

技术标签:

【中文标题】unique_ptr 自定义存储类型示例?【英文标题】:unique_ptr custom storage type example? 【发布时间】:2011-06-07 12:41:34 【问题描述】:

Howard Hinnant explained unique_ptr 也可以使用自定义存储类型。他以“共享内存”为例。

他只给出了粗略的想法(这对于快速介绍来说很好)。但是任何人都可以完成他的 “自定义存储类型” 示例(无论是否共享内存)?

为了支持将unique_ptr 放入共享内存,自定义删除器可以包含自定义指针类型(在共享内存应用程序中通常不是真正的指针)。只需放置一个名为 pointer嵌套类型,它在您的删除器中模拟指针行为,可公开访问:

template <class T>
class MyDeleter

public:
    class pointer
    
     public:
        friend bool operator==(pointer x, pointer y);
        friend bool operator!=(pointer x, pointer y);
        // ...
    ;

    void operator()(pointer p);
;

void test()

    unique_ptr<int, MyDeleter<int> > p;
    MyDeleter<int>::pointer p2 = p.get();  // A custom pointer type used for storage

我怀疑// ... 必须扩展,test() 可能会在真正的“自定义存储类型”示例中做一些额外的事情。

谁能告诉我他/她在哪里

实际上已经使用过此自定义, 在那个上下文中, 哪个自定义代码,(可能在//...) 以及客户端代码如何使用它? (test() 可能)

【问题讨论】:

这种自定义不太可能有很多用途——因为它是一个非常新的库功能。 【参考方案1】:

您可能对boost::offset_ptr 感兴趣,它是unique_ptr 中此自定义点的激励用例。 offset_ptr 是一种完全开发的指针类型,可以使用简单的 typedef 安装到自定义删除器中。它的用例是将unique_ptr 放入共享内存中。

【讨论】:

【参考方案2】:

20.7.1.2/3 告诉我们

unique_ptr::pointer 类型应满足 NullablePointer (17.6.3.3) 的要求。

根据 17.6.3.3,给定类型 P,这些要求是:

PEqualityComparableDefaultConstructibleCopyConstructibleCopyAssignableDestructible P 的左值可交换 对P类型的对象进行值初始化会产生该类型的空值,空值应仅与自身等价 P 类型的对象可以上下文转换bool P 类型的对象可以用nullptr 进行初始化和分配,这会产生空值 P 类型的对象与nullptr 比较可以相等,当且仅当对象具有空值时比较为真 所有必需的操作都不会抛出(但不需要显式的noexceptthrow()

请特别注意,operator*operator-&gt; 实际上并不是必需的。另请注意,内置数字类型满足除nullptr 初始化/赋值之外的所有要求。

例如,以下类型应满足所有要求:

class handle 
    int id;
  public:
    // default and nullptr constructors folded together
    handle(std::nullptr_t = nullptr) : id(0)  

    explicit operator bool()  return l.id != 0; 

    friend bool operator ==(handle l, handle r)  return l.id == r.id; 
    friend bool operator !=(handle l, handle r)  return !(l == r); 

    // default copy ctor and operator= are fine

    // explicit nullptr assignment and comparison unneeded
    // because of implicit nullptr constructor

    // swappable requirement fulfilled by std::swap

【讨论】:

感谢您向我指出该参考,并提供示例。你称那个类为handle——因此我可以通过在我的deleter中放置一个typdef handler pointer;来使用那个类? @towi - 是的。该类应该类似于许多库中使用的某种不透明标识符的包装器,例如 Windows 窗口句柄或 OpenGL 纹理名称。

以上是关于unique_ptr 自定义存储类型示例?的主要内容,如果未能解决你的问题,请参考以下文章

带有 C++11+ unique_ptr 的 Libevent

指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器

使用带有自定义释放器的 std::unique_ptr 来包装原始指针

一些 std::unique_ptr 使用和“陷阱”

像自定义类一样构造的指针(内置类型)如何工作?

NestJS 基于接口注入自定义 TypeOrm 存储库