2011-06-07 24 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