2013-08-11 17 views
7

Dies ist eine theoretische Frage. Angenommen, es gibt einige Objekte, die unter anderem Listen von Rückruffunktionen enthalten, die Ereignisse dieser Objekte abonniert haben. Jetzt möchten wir diese Objekte auf der Festplatte speichern. Ist ein std::function serialisierbar?Kann std :: function serialisiert werden?

+1

Wandern ein bisschen weiter zu "üben": es ist wahrscheinlich * möglich * zu raw Funktionszeiger und Dinge wie FastDelegate zu serialisieren, aber Sie werden eine Tonne von Korrekturen haben. http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible zeigt einige der Vielfalt der Implementierung von Funktionszeigern zur Laufzeit. Fügen Sie dem OS und dem Lader mehr Komplexität hinzu - z.B. gemeinsame Objekte und ASLR. Eine ziemliche Aufgabe. Ich würde gerne Compiler + plattformspezifische Hacks am unteren Ende lesen; auch portable Workarounds (wir haben enum-> func LUTs für statische Methoden verwendet). – leander

+0

Nun, 'std :: function' kann nicht einmal mit einer anderen' std :: function' verglichen werden ('operator ==' et al.), Also wäre das Serialisieren eine Strecke. – dalle

Antwort

5

Nr

Wenn Typ Löschung verwendet (dh versteckt Details der Implementierung hinter einer Schnittstelle), die nur ohne verfügbaren Operationen den dynamischen Typ des Objekts zu wissen, sind die durch die Schnittstelle zur Verfügung gestellt.

Es gibt keine Serialisierung in dem C++ Standard, und es gibt keine einfache Möglichkeit, Funktionen entweder (ohne Reflexion), damit die std::function Schnittstelle bietet keine Serialisierung serialisiert.

Auf der anderen Seite verhindert nichts Sie von einer Callback Basisklasse verwenden, die Serialisierungsunterstützung bietet.

0

Ja, ist es und nein, ist es nicht. Theoretisch können Sie Daten serialisieren, auf denen das Funktionsobjekt ausgeführt wird, aber Sie benötigen den kompilierten Code trotzdem, da Sie keine Daten ausführen können, ohne hässliche Hacks zu verwenden.

5

std::function ist ein Typ-Lösch-Objekt, das Wert Semantik gehorcht. Es macht die Konstruktion und Zuweisung von Kopieren/Verschieben und die Ausführung einer bestimmten Signatur sowie die Zerstörung verfügbar.

Keine von diesen sind Serialisierung.

Intern wird die typische Implementierung std::function ist eine Implementierung Helfer template Klasse auf seiner konstruiert-von Argument zu schaffen, die die obigen Operationen auf das Argument, Wraps, dann die std::function selbst delegiert seine Durchführung dieser Operationen auf das Hilfsobjekt.

Das Layout dieses Hilfsobjekts hängt vom Layout des Arguments ab, das aus (zusätzlich zu seiner Existenz als optional und seiner implementierungsabhängigen Implementierung) aufgebaut ist.

Sie könnten versuchen, ein ähnliches Objekt zu erstellen, das Serialisierung unterstützt, aber ein Typlöschobjekt beruht auf der Tatsache, dass der Typ, der gelöscht wird, die betreffende Operation bereits implementiert. Dies bedeutet, dass Sie nur von der Dubtype-Ebene aus einen Typ erstellen können, der eine Funktion mit Serialisierung gelöscht hat, die eine Funktion mit Serialisierungsschnittstelle unterstützt.

Verwandte Themen