2012-01-30 81 views
8

是否有一個標準指針類(或Boost),它是一個非共享指針,用於處理不完整類型?我已經瀏覽了C++ 11標準和boost庫,但找不到一個,儘管它看起來非常有用。一個不完整類型的非共享智能指針

例如,我希望能夠使用智能指針製作不透明類型。

class A; 
    wrap_ptr<A> some_func(); 
    void other_func(A const &); 

A是一種不透明的類型,可用於各種功能。上述接口的用戶只有A的不完整定義,但應該能夠刪除/重置指針。我知道上述可以用shared_ptr來完成,但是在這個特定的代碼中有一個我不想要的開銷。 unique_ptr擁有正確的所有權語義,但無法使用不完整的類型。理論上,一個包裝只需要一個指向刪除器的開銷。

在C++ 11或boost庫中是否存在這樣的類型?

注:我明白我可以輕鬆地構建這種類型,但如果可能的話我更喜歡標準類型。它似乎應該是一個基本的智能指針類型。


UPDATEunique_ptr並不似乎是一個不錯的選擇。首先,語法開銷將被抵消。其次,我不相信它可以安全地與自定義刪除器一起使用。我會檢查它是如何工作的。

回答

4

實際上,unique_ptr可以使用不完整的類型,只要您指定一個自定義刪除程序。

但是,與shared_ptr相反,這實際上會影響其類型,因爲自定義刪除器是靜態精簡的(作爲第二個模板參數)。

+0

儘管技術上屬實,但直接使用它在語法上不友好。你不能簡單地做'ptr_type(new T)',但是,假設你得到的模板typedef正確,你必須執行'ptr_type(new T,T ::〜T)'。 – 2012-01-30 09:46:44

+1

實際上,仔細查看'unique_ptr'不能使用具有狀態的定製刪除程序。 'reset'函數不允許指定刪除器,只有構造函數會這樣做,因此'unique_ptr'的自定義刪除方面部分被破壞。 – 2012-01-30 09:47:40

+0

不需要自定義刪除器,只有在調用'unique_ptr'的析構函數時才需要完成類型,這意味着您可以在持有的類完成後定義析構函數。 – Xeo 2012-01-30 13:20:34

1

std::unique_ptr可以處理這種情況,但不能使用默認的刪除器。您需要編寫一個可以處理不完整類型的刪除程序,然後使用std::unique_ptr<A,MyDeleter>

9

要清楚的unique_ptr:它不完全類型的工作,但如果你在這樣一類的標題使用它:

#include <memory> 

class A; 

class B 
{ 

std::unique_ptr<A> m_a; 

}; 

它不會因爲缺少缺失者實施的鏈接。 有一個簡單的解決方法:只需在cpp中定義宿主類的de析構函數,即使它是空的或應該是默認的!

// B.hpp 
#include <memory> 

class A; 

class B 
{ 
public: 

    B(); 
    ~B(); 

private: 

std::unique_ptr<A> m_a; 

}; 

// B.cpp 

B::B(){} // or =default; (if you have a compiler providing it) 
B::~B(){} // or =default; (if you have a compiler providing it) 

此外,閱讀回答我的問題有:Is std::unique_ptr<T> required to know the full definition of T?

也許看一看建議成語如何PIMPL(意味着在的unique_ptr uncomplete型)由香草薩特被implmented:http://herbsutter.com/gotw/_100/

+1

這不是我想要的用途。我想在函數的返回值中使用指針,在調用者永遠不會看到完整類型的地方。 – 2012-01-30 15:21:06

相關問題