2013-08-11 25 views
7

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?

+1

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

+0

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

Odpowiedz

5

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.

0

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.

5

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.