2011-06-07 52 views
2

Howard Hinnantexplainedunique_ptr也可以使用自定义存储类型。他提到的例子是“共享内存”。unique_ptr自定义存储类型的例子?

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

为了支持将unique_ptr到共享存储器中,自定义删除器可以包含一个自定义指针类型(通常不共享存储器应用的实际指针)。一个简单的放置一个嵌套式称为指针看齐您删除器内的指针行为,公开访问:

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()可能)
+0

有不太可能是这许多用途customization-因为它是一个非常新的库功能。 – Puppy 2011-06-07 23:36:04

回答

2

您可能会感兴趣boost::offset_ptr其担任该激励用例在unique_ptr这种定制点。 offset_ptr是一种完全开发的指针类型,可以使用简单的typedef将其安装到自定义删除程序中。它的用例是将unique_ptr放入共享内存。

2

20.7.1.2/3告诉我们

的unique_ptr < T,d > ::指针应满足NullablePointer的(17.6.3.3)的要求的类型。

根据17.6.3。3,给出一种类型,P,这些要求是:

  • PEqualityComparable的可缺省复制构造CopyAssignable,和P可破坏
  • 左值是可交换
  • Value-i nitializing类型P的对象产生的类型的空值,和空值,应仅将自身相当于
  • P类型的对象可以是上下文转换bool
  • P类型的对象可以与被初始化并分配nullptr,并且这产生空值
  • P类型的对象可以是平等相比nullptr,并且当且仅当对象具有空值的比较结果为true
  • 无所需的操作的,具体可以是operator*operator->实际上并不需要抛出(但需没有明确noexceptthrow()

注意。另请注意,内置的数字类型满足除初始化/赋值外的所有要求(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 
} 
+0

感谢您将该参考指向我,并举例说明。你称这个类为“handle” - 因此,我可以通过在我的* deleter *中放置一个“typdef处理程序指针”来使用该类。 – towi 2011-06-11 11:45:28

+0

@towi - 是的。该类应该类似于许多库中使用的某种不透明标识符的包装,例如Windows窗口句柄或OpenGL纹理名称。 – JohannesD 2011-06-11 13:09:05

相关问题