2011-06-12 23 views
18

Loại tẩy xoá - đó là cách bạn gọi nó?Loại tẩy xoá trong C++: cách tăng :: shared_ptr và boost :: chức năng hoạt động?

Làm cách nào để boost::shared_ptr lưu trữ deleter và cách boost::function lưu trữ đối tượng chức năng của nó?

Có hướng dẫn nào dạy mẹo này không?

Chi phí thời gian chạy của việc sử dụng các đối tượng hàm loại đã xóa là bao nhiêu?

+2

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. –

+14

@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

Trả lời

23

Ý 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ênxó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ỏ.

+0

shared_ptr deleter không bắt nguồn từ bất kỳ thứ gì. – pic11

+5

@ pic11: Deleter được truyền vào 'shared_ptr' không cần thừa kế, * nhưng * loại xóa được thực hiện bằng cách sử dụng thừa kế (hoặc hàm con trỏ) trong nội bộ. –

+0

Làm thế nào bạn gọi một đối tượng hàm nếu bạn không biết loại tĩnh của nó và/hoặc nó không kế thừa từ một lớp cơ sở? – pic11

Các vấn đề liên quan