2011-06-12 117 views
18

類型擦除 - 你是怎麼稱呼它的?C++類型擦除:boost :: shared_ptr和boost :: function如何工作?

如何boost::shared_ptr存儲其刪除器,以及如何boost::function存儲其函數對象?

有沒有教伎倆任何教程?

什麼是使用類型擦除函數對象的運行時間成本?

+2

您是否在嘗試谷歌之前詢問?網上有很多信息。老Thamas貝克爾文章:http://www.artima.com/cppsource/type_erasure.html或這個着名的書:http://www.boostpro.com/mplbook/和許多其他資源。 – 2011-06-12 21:36:23

+14

@GeneBushuyev:SO的全部目的基本上是讓Google搜索變得不必要。如果你想了解一些與編程有關的主題,你可以谷歌它,並(1)找到一個SO答案,或(2)獲得不可靠的信息,可能會或可能不正確,並幫助你。或者您可以(2)在SO上搜索/索取,並獲得經同行評審的答案,按質量進行評分,並且幾乎保證有用。請不要告訴人們谷歌而不是在這裏提問。這適得其反。 – jalf 2012-03-04 00:16:20

回答

23

的想法很簡單,您可以定義與您需要的功能的接口的基類,然後從它繼承。由於類型擦除類只使用該接口,下面的實際類型是忘記刪除。或者,如果唯一需要的接口可以表示爲自由函數,則可以存儲指向自由函數的指針。

namespace detail { 
    struct deleter_base { 
     virtual ~deleter_base() {} 
     virtual void operator()(void*) = 0; 
    }; 
    template <typename T> 
    struct deleter : deleter_base { 
     virtual void operator()(void* p) { 
     delete static_cast<T*>(p); 
     } 
    }; 
} 
template <typename T> 
class simple_ptr { 
    T* ptr; 
    detail::deleter_base* deleter; 
public: 
    template <typename U> 
    simple_ptr(U* p) { 
     ptr = p; 
     deleter = new detail::deleter<U>(); 
    } 
    ~simple_ptr() { 
     (*deleter)(ptr); 
     delete deleter; 
    } 
}; 

這是一個非常簡化的智能指針,但這個想法是存在的。在shared_ptr的特定情況下,刪除器被存儲爲引用計數對象的一部分,該引用計數對象由指針保存。

+0

shared_ptr deleter不必從任何東西派生。 – pic11 2011-06-12 21:28:07

+5

@ pic11:傳遞給'shared_ptr'的deleter不需要繼承,*但通過在內部使用繼承(或函數指針)來實現*類型的擦除。 – 2011-06-12 21:31:09

+0

如果你不知道它的靜態類型和/或它沒有從基類繼承,你如何調用一個函數對象? – pic11 2011-06-12 21:35:13

相關問題