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?
Antwort
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.
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.
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.
- 1. std :: bind std :: function?
- 2. std :: vector von std :: function
- 3. boost :: any kann nicht zurück geworfen werden std :: function
- 4. std :: function -> Funktionszeiger
- 5. std :: function kann überladene Funktionen nicht unterscheiden
- 6. std :: function Template Syntax
- 7. std :: function implizite Typumwandlung
- 8. kann nicht Ergebnis von std :: bind konvertieren std :: function
- 9. std :: function und std :: bind Verhalten
- 10. Understanding std :: function und std :: bind
- 11. Wie zu umhüllen std :: function
- 12. G ++, clang ++ und std :: function
- 13. Vergleichen std :: tr1 :: function <> Objekte
- 14. Kann std :: function eine Funktion mit variadische Argumente
- 15. Spring Boot spring.datasource.CONFIGURATION_PROPERTIES Kann nicht serialisiert werden
- 16. java.lang.RuntimeException: kann nicht serialisiert werden: float
- 17. Wie kann GenericXmlSecurityToken gespeichert/deserialisiert/serialisiert werden?
- 18. Vector von std :: function <>
- 19. Wie kann ich std :: function mit Array erstellen?
- 20. Kann ein std :: function member auf andere Mitglieder zugreifen?
- 21. Kann nicht nennen generic std :: function Mitglied von Template-Klasse
- 22. Wie kennt die std :: function die Aufrufkonvention?
- 23. Was ist der Unterschied zwischen std :: function und std :: mem_fn
- 24. Do std :: function und std :: bind tun dynamische Speicherzuweisung?
- 25. Übergeben Sie anonymes Funktionsobjekt an std :: function?
- 26. Warum std :: function :: Argumenttyp ist veraltet?
- 27. Zurückgeben eines Lambda ohne std :: function
- 28. Wie ist std :: function für ein Lambda
- 29. Erhalte den Namen einer std :: function
- 30. C++ std :: function-like Template Syntax
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
Nun, 'std :: function' kann nicht einmal mit einer anderen' std :: function' verglichen werden ('operator ==' et al.), Also wäre das Serialisieren eine Strecke. – dalle