類型擦除 - 你是怎麼稱呼它的?C++類型擦除:boost :: shared_ptr和boost :: function如何工作?
如何boost::shared_ptr
存儲其刪除器,以及如何boost::function
存儲其函數對象?
有沒有教伎倆任何教程?
什麼是使用類型擦除函數對象的運行時間成本?
類型擦除 - 你是怎麼稱呼它的?C++類型擦除:boost :: shared_ptr和boost :: function如何工作?
如何boost::shared_ptr
存儲其刪除器,以及如何boost::function
存儲其函數對象?
有沒有教伎倆任何教程?
什麼是使用類型擦除函數對象的運行時間成本?
的想法很簡單,您可以定義與您需要的功能的接口的基類,然後從它繼承。由於類型擦除類只使用該接口,下面的實際類型是忘記和刪除。或者,如果唯一需要的接口可以表示爲自由函數,則可以存儲指向自由函數的指針。
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
的特定情況下,刪除器被存儲爲引用計數對象的一部分,該引用計數對象由指針保存。
您是否在嘗試谷歌之前詢問?網上有很多信息。老Thamas貝克爾文章:http://www.artima.com/cppsource/type_erasure.html或這個着名的書:http://www.boostpro.com/mplbook/和許多其他資源。 – 2011-06-12 21:36:23
@GeneBushuyev:SO的全部目的基本上是讓Google搜索變得不必要。如果你想了解一些與編程有關的主題,你可以谷歌它,並(1)找到一個SO答案,或(2)獲得不可靠的信息,可能會或可能不正確,並幫助你。或者您可以(2)在SO上搜索/索取,並獲得經同行評審的答案,按質量進行評分,並且幾乎保證有用。請不要告訴人們谷歌而不是在這裏提問。這適得其反。 – jalf 2012-03-04 00:16:20