【问题标题】:unique_ptr custom storage type example?unique_ptr 自定义存储类型示例?
【发布时间】: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() 可能)

【问题讨论】:

  • 这种自定义不太可能有很多用途——因为它是一个非常新的库功能。

标签: c++11 unique-ptr


【解决方案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 纹理名称。
    猜你喜欢
    • 2017-05-15
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2016-08-02
    • 2020-09-18
    相关资源
    最近更新 更多