2013-08-11 42 views
7

Đâ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?

+1

Đ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

+0

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

Trả lời

5

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.

0

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

5

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.

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