2014-06-11 17 views
5

Tôi muốn sử dụng observer_ptr trong dự án của mình, nhưng paper chỉ xác định giao diện, không phải là triển khai hoàn chỉnh. Bây giờ có triển khai nguồn mở hay tôi phải tự mình làm điều đó?Hiện có triển khai cho observer_ptr không?

+0

Từ tóm tắt, tôi không thấy nhiều sự khác biệt với 'weak_ptr'. Chỉnh sửa: Các giấy thậm chí không đề cập đến 'weak_ptrs' ... WTH ?? – RedX

+5

@RedX: weak_ptr cần một trạng thái được chia sẻ được phân bổ và sẽ không thể sử dụng được trừ khi đối tượng được sở hữu bởi một số shared_ptr. Vì vậy, ngữ nghĩa và cách sử dụng có vẻ khá khác nhau. Không thể sử dụng – lisyarus

+1

@RedX, 'weak_ptr' trên' unique_ptr'. – UniversE

Trả lời

15

Bạn có thể tạo cái gọi là observer_ptr một cách tầm thường bằng cách tạo một unique_ptr với dấu phân cách NOP.

template<typename T> 
struct nop_deleter 
{ 
    void operator()(T*) const {} 
}; 

template<typename T> 
using observer_ptr = unique_ptr<T, nop_deleter>; 

này vẫn sẽ có hành vi unique_ptr 's, có nghĩa là nó di chuyển chỉ, trong khi bạn muốn observer_ptr được copyable. Điều này dẫn chúng tôi đến triển khai đơn giản hơn:

template<typename T> 
using observer_ptr = T*; 

Điều này làm mọi thứ bạn muốn. Bạn có thể gọi nó là observer_ptr<int> thay vì int *, bởi vì sau này là, tất nhiên, điều ác. Nó có thể sao chép được, và không làm gì khi phá hủy.


tôi là khôi hài trong câu trả lời ở trên, nhưng hy vọng, nó sẽ chứng minh rằng observer_ptr không có nhiều tiện ích khác ngoài việc có một tên khác so với một loại con trỏ thô. Có không có gì sai khi sử dụng con trỏ thô không sở hữu.

Bạn có thể tranh luận rằng observer_ptr truyền đạt ý định, nhưng đối số đó chỉ hợp lệ nếu cơ sở mã của bạn chứa các trường hợp con trỏ thô quản lý tài nguyên. Loại bỏ những người và sau đó một con trỏ thô sẽ tự động có nghĩa là observer_ptr ... mà không có tên lạ mắt.


Nếu bạn hoàn toàn phải có tên lạ mắt và/hoặc một loại riêng biệt, tự mình triển khai nên dễ dàng.

+4

Tôi cho rằng một trong những tính năng cần thiết của Observer_ptr là giao diện của nó tương thích với các con trỏ thông minh khác (có các phương pháp như reset, swap, get, có lẽ là release) – lisyarus

+1

Cảm ơn bạn rất nhiều :) ! Tôi không nghĩ rằng việc sử dụng các nhà thơ nguyên là điều ác. Tránh và chỉ sử dụng chúng khi phải là vì trông hỗn loạn khi hỗn hợp "unique_ptr xxx" và "xxx * xxx" được trộn lẫn. Nói cách khác, tôi quên và không muốn kiểm tra mọi con trỏ thô liệu nó có bị xóa/giải phóng một cách an toàn sau một vài tháng và sau đó tôi gần như hoàn toàn quên đi phân đoạn mã: D – UniversE

+2

@lisyarus Vâng, giao diện phù hợp với các con trỏ thông minh khác và có thể đôi khi bạn cần. Nhưng tôi đã không đi qua sự cần thiết phải hoạt động chung về một loại con trỏ thông minh mà không có kiến ​​thức về ngữ nghĩa quyền sở hữu tại chơi. Nhưng tôi chắc chắn một ví dụ giả tạo có thể được nấu chín ở nơi điều này sẽ hữu ích. Tuy nhiên, trên thực tế, tiện ích sẽ khá hạn chế. – Praetorian

7

Có: observer-ptr cho C++ 98 trở đi trên GitHub.

+0

Martin Moene, cảm ơn bạn :) Đó là một công việc rất hay. – UniversE

+0

Cảm ơn bạn, đây là câu trả lời được chấp nhận thay vì câu trả lời "được chấp nhận" trong lưỡi. – Elizafox

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