To jest pytanie teoretyczne. Powiedzmy, że istnieją pewne obiekty, które zawierają między innymi listy funkcji oddzwaniania subskrybowanych do zdarzeń tych obiektów. Teraz chcemy przechowywać te obiekty na dysku. Czy można serializować z std::function
?Czy std :: function może być serializowane?
Odpowiedz
nr
Ilekroć użyciu typu skasowaniu (czyli ukrywanie szczegółów implementacyjnych za pomocą interfejsu), jedynym operacje dostępne bez znajomości dynamiczny typ obiektu są dostarczane przez interfejs.
Nie ma serializacji w C++ standard, i nie ma łatwy sposób serializacji funkcje albo (bez odbicia), tak więc interfejs std::function
nie przewiduje serializacji.
Z drugiej strony, nic nie stoi na przeszkodzie, aby, używać klasy bazowej Callback
zapewniającej obsługę serializacji.
Tak, jest i nie, nie jest. Teoretycznie możesz serializować dane, na których obiekt funkcji będzie działał, ale będziesz potrzebował skompilowanego kodu, ponieważ nie możesz wykonywać danych bez uciekania się do brzydkich hacków.
std::function
to obiekt do wymazywania typów, który słucha semantyki wartości. Ujawnia kopiowanie/przenoszenie konstrukcji i przypisania oraz wykonanie określonego podpisu i zniszczenie.
Żadne z nich nie jest serializowane.
Wewnętrznie, typowa realizacja std::function
jest stworzenie implementacji pomocnik template
klasę na jego zbudowany-z argumentem, który owija powyższe operacje na argumencie, wtedy sama std::function
delegaci jego realizacja tych operacji dla obiektu pomocnika.
Układ tego obiektu pomocnika będzie zależał od układu konstruowanego argumentu (oprócz tego, że jest opcjonalny, a jego implementacja zależy od implementacji).
Można spróbować utworzyć podobny obiekt obsługujący serializację, ale obiekt wymazywania typów polega na tym, że usuwany typ implementuje już daną operację. Co oznacza, że można skonstruować typ usuniętej funkcji-serializacji z obiektu, który obsługuje interfejs funkcji szeregowania przynajmniej na poziomie dukty.
Wędrując trochę dalej, aby "ćwiczyć": prawdopodobnie * możliwe * jest serializowanie surowych wskaźników funkcyjnych i rzeczy takich jak FastDelegate, ale będziesz miał mnóstwo poprawek. http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-Fastest-Fossible pokazuje możliwośd różnorodności implementacji wskaźników funkcyjnych w czasie wykonywania. Dodaj więcej złożoności z os i programu ładującego - np. obiekty wspólne i ASLR. Dość zadanie. Chciałbym czytać kompilator + specyficzne dla platformy hacki na niskim końcu; również przenośne obejścia (użyliśmy enum-> func LUTs dla metod statycznych). – leander
Cóż, 'std :: function' nie może nawet być porównywany (' operator == 'i wsp.) Do innej' std :: function', więc serializacja byłaby rozciągliwa. – dalle