Đây là một câu hỏi lý thuyết. Nói rằng có một số đối tượng trong số những đối tượng khác chứa danh sách các chức năng gọi lại đã đăng ký với các sự kiện của các đối tượng đó. Bây giờ chúng tôi muốn lưu trữ các đối tượng trên đĩa. Có phải là std::function
có thể tuần tự hóa không?Có thể std :: chức năng được serialized?
Trả lời
số
Bất cứ khi nào sử dụng loại tẩy xoá (ví dụ, ẩn chi tiết thực hiện đằng sau một giao diện), các hoạt động chỉ có sẵn mà không biết loại năng động của các đối tượng được cung cấp bởi những giao diện.
Không có tuần tự hóa trong tiêu chuẩn C++ và không có cách dễ dàng để tuần tự hóa chức năng hoặc (không phản ánh), do đó giao diện std::function
không cung cấp tuần tự hóa.
Mặt khác, không có gì ngăn cản bạn sử dụng lớp cơ sở Callback
cung cấp hỗ trợ tuần tự hóa.
Có, nó là và không, nó không phải là. Về lý thuyết, bạn có thể tuần tự hóa dữ liệu đối tượng chức năng sẽ được chạy trên, nhưng bạn sẽ cần mã được biên dịch anyway, vì bạn không thể thực thi dữ liệu mà không cần đến hacks xấu xí.
std::function
là đối tượng tẩy xóa loại tuân theo ngữ nghĩa giá trị. Nó cho thấy việc xây dựng và chuyển nhượng sao chép/di chuyển và thực hiện một chữ ký cụ thể và phá hủy.
Không ai trong số này là serialization.
Nội bộ, việc thực hiện điển hình của std::function
là tạo một trình trợ giúp triển khai template
lớp trên đối số được xây dựng của nó, bao gồm các hoạt động trên đối số, sau đó tự mình thực hiện các hoạt động đó cho đối tượng trợ giúp.
Bố cục của đối tượng trợ giúp đó sẽ phụ thuộc vào bố trí của đối số được xây dựng từ (trên đầu trang của sự tồn tại của nó là tùy chọn và triển khai thực hiện phụ thuộc).
Bạn có thể thử tạo một đối tượng tương tự hỗ trợ tuần tự hóa, nhưng đối tượng xóa loại dựa vào thực tế là loại bị xóa đã thực hiện thao tác được đề cập. Điều đó có nghĩa là bạn chỉ có thể xây dựng một kiểu xóa với chức năng tuần tự hóa từ một đối tượng hỗ trợ giao diện chức năng-tuần tự hóa ít nhất ở cấp độ kiểu con vịt.
- 1. std :: vectơ chức năng
- 2. std :: chức năng và std :: hành vi
- 3. Có thể std :: async được sử dụng với chức năng mẫu
- 4. std :: ràng buộc và std :: chức năng câu hỏi
- 5. Gọi std :: chức năng trong một std :: for_each
- 6. chức năng 'hợp lệ' std :: là gì?
- 7. std :: chức năng và std :: packaged_task chuyển đổi
- 8. gọi std :: async chức năng thành viên
- 9. Visual Studio 2010 và std :: chức năng
- 10. std :: result_of chức năng đơn giản
- 11. Chức năng `std ::` có được phép di chuyển đối số của nó không?
- 12. Chức năng 'stof' không thể được giải quyết
- 13. JS chức năng không thể đếm được
- 14. std :: chức năng với các chức năng thành viên không tĩnh
- 15. Tại sao chức năng Boost.Bind có thể được gọi với các tham số phụ?
- 16. trả lại một lambda không std :: chức năng
- 17. Các mẫu biến thể không có tham số chức năng
- 18. C++ 11 std :: chức năng và chuyển tiếp hoàn hảo
- 19. Đi qua chức năng thành viên để std :: chủ đề
- 20. C++ 11 variadic std :: tham số chức năng
- 21. quá tải trên std :: chức năng <...>
- 22. Chức năng nạp chồng quá tải thông qua std :: function
- 23. std :: unique_ptr xóa chức năng, initializer_list - điều khiển phân bổ
- 24. C++ tùy chỉnh so sánh chức năng cho std :: sort()
- 25. std :: ràng buộc của chức năng thành viên lớp
- 26. Lưu trữ con trỏ hàm trong std :: chức năng
- 27. Sử dụng chức năng thành viên trong std :: packaged_task
- 28. Sử dụng decltype và std :: chức năng với lambda
- 29. Có một trường hợp sử dụng cho std :: chức năng mà không được bao phủ bởi con trỏ chức năng, hoặc là nó chỉ cú pháp đường?
- 30. std :: thread <chưa được giải quyết quá tải loại chức năng> lỗi
Đi lang thang một chút để "thực hành": có thể * có thể * để sắp xếp các con trỏ hàm thô và những thứ như FastDelegate, nhưng bạn sẽ có rất nhiều bản sửa lỗi. http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible Hiển thị một số tính đa dạng của việc triển khai các con trỏ hàm trong thời gian chạy. Thêm độ phức tạp hơn từ trình tải và trình tải xuống - ví dụ: các đối tượng được chia sẻ và ASLR. Khá một nhiệm vụ. Tôi rất thích đọc trình biên dịch + nền tảng hack cụ thể vào cuối thấp; cũng là cách giải quyết di động (chúng tôi đã sử dụng enum-> func LUTs cho các phương pháp tĩnh). – leander
Vâng, 'std :: function' thậm chí không thể so sánh (' operator == 'et al.) Với một' std :: function' khác, vì vậy việc tuần tự hóa sẽ là một đoạn. – dalle