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?
Trả lời
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.
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
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
@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
Có: observer-ptr cho C++ 98 trở đi trên GitHub.
- 1. Có triển khai cho SqlGeometryBuilder không?
- 2. Có triển khai "getopt" cho Delphi không?
- 3. Có triển khai Erlang cho Android không?
- 4. Có triển khai bcrypt có sẵn cho Delphi không?
- 5. Có triển khai hàng đợi chuẩn cho C không?
- 6. CoffeeScript, triển khai 'thực hiện'
- 7. Có bản đồ triển khai thực hiện với người nghe cho Java không?
- 8. Tôi có nên triển khai IDisposable cho User Control không?
- 9. FlashDevelop có thể triển khai cho iOS không?
- 10. Có triển khai R cho Java hay .NET không?
- 11. Có triển khai .NET cho Mac OS không?
- 12. Có trình khách WebSocket được triển khai cho python không?
- 13. Có triển khai SPARQL luồng không?
- 14. Có triển khai vector không khóa không?
- 15. Có triển khai thực hiện máy chủ OAuth nút
- 16. Đường dẫn triển khai không hoạt động cho Phương pháp triển khai Git trong triển khai trung gian
- 17. con trỏ bù nhỏ gọn, triển khai hiện có?
- 18. Triển khai một ứng dụng hiện có trong Openshift
- 19. Triển khai ứng dụng Django hiện có trên Heroku
- 20. MQTT messageId triển khai thực hiện
- 21. Lỗi triển khai thực hiện metaphone PHP
- 22. Triển khai thực hiện lệnh không hoạt động :: ostream
- 23. Có triển khai SQL PBKDF2 không?
- 24. Haskell có thể triển khai OSGi không?
- 25. Có triển khai VBScript của Markdown không?
- 26. Tôi có nên triển khai onRetainNonConfigurationInstance không?
- 27. triển khai yaml2xml/xml2yaml có sẵn không?
- 28. Triển khai thực hiện tùy chỉnh
- 29. Triển khai PHP cho Heroku
- 30. Triển khai Hashtable cho C
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
@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
@RedX, 'weak_ptr' trên' unique_ptr'. – UniversE