Ý tưởng rất đơn giản, bạn xác định lớp cơ sở có giao diện với chức năng bạn cần và sau đó kế thừa từ đó. Vì loại chỉ xóa lớp chỉ sử dụng giao diện đó, loại thực tế bên dưới là bị lãng quên và xóa. Ngoài ra, nếu giao diện cần thiết duy nhất có thể được thể hiện dưới dạng các hàm miễn phí, bạn có thể lưu trữ con trỏ đến các hàm miễn phí.
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;
}
};
Đây là con trỏ thông minh thực sự đơn giản, nhưng ý tưởng là ở đó. Trong trường hợp cụ thể của shared_ptr
, số deleter được lưu trữ như một phần của đối tượng đếm tham chiếu, được giữ bởi con trỏ.
Nguồn
2011-06-12 21:13:32
bạn đã thử google trước khi hỏi chưa? có rất nhiều thông tin trên web. bài viết cũ Thamas Becker: http://www.artima.com/cppsource/type_erasure.html hoặc cuốn sách nổi tiếng này: http://www.boostpro.com/mplbook/ và nhiều tài nguyên khác. –
@GeneBushuyev: toàn bộ mục đích của SO về cơ bản là làm cho các tìm kiếm của Google không cần thiết. Nếu bạn muốn tìm hiểu về một số chủ đề liên quan đến chương trình, bạn có thể sử dụng Google, và (1) tìm câu trả lời SO hoặc (2) nhận thông tin không đáng tin cậy có thể có hoặc không chính xác và giúp bạn. Hoặc bạn có thể (2) tìm kiếm/yêu cầu trên SO và nhận câu trả lời được đánh giá ngang hàng, được đánh giá theo chất lượng và hầu như được đảm bảo hữu ích. Vui lòng không thông báo cho mọi người tới Google thay vì đặt câu hỏi tại đây. Nó phản tác dụng. – jalf