2013-08-11 13 views
7

Questa è una domanda teorica. Diciamo che ci sono alcuni oggetti che, tra gli altri, contengono elenchi di funzioni di callback abbonati agli eventi di quegli oggetti. Ora vogliamo archiviare questi oggetti sul disco. È un serializzabile std::function?È possibile serializzare la funzione std ::?

+1

Vagare un po 'troppo "in pratica": è probabilmente * possibile * serializzare i puntatori di funzioni raw e cose come FastDelegate, ma avrete un sacco di correzioni. http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible mostra alcune delle diverse implementazioni dei puntatori di funzione in fase di esecuzione. Aggiungi più complessità da os e loader - ad es. oggetti condivisi e ASLR. Piuttosto un compito Mi piacerebbe leggere gli hack compilatori + specifici della piattaforma nella fascia bassa; anche soluzioni manuali (abbiamo usato enum-> func LUT per i metodi statici). – leander

+0

Bene, 'std :: function' non può nemmeno essere paragonato (' operator == 'et al.) Ad un altro' std :: function', quindi la serializzazione sarebbe un allungamento. – dalle

risposta

5

No.

Ogniqualvolta utilizzando cancellazione di tipo (cioè nascondono dettagli implementativi dietro un'interfaccia), le sole operazioni disponibili senza conoscere il tipo dinamico dell'oggetto sono quelle previste dall'interfaccia.

Non c'è serializzazione standard C++, e non c'è modo semplice per serializzare funzioni o (senza riflessione), quindi l'interfaccia std::function non fornisce serializzazione.

D'altra parte, nulla impedisce di di utilizzare una classe di base Callback che fornisce il supporto di serializzazione.

0

Sì, lo è e no, non lo è. In teoria, è possibile serializzare i dati su cui verrà eseguito l'oggetto funzione, ma sarà comunque necessario compilare il codice, poiché non è possibile eseguire i dati senza ricorrere a brutti hack.

5

std::function è un tipo di oggetto di cancellazione che obbedisce alla semantica del valore. Espone copia/sposta la costruzione e l'assegnazione e l'esecuzione di una particolare firma e distruzione.

Nessuno di questi è la serializzazione.

Internamente, la tipica implementazione di std::function è creare un'implementazione helper template classe sua costruzione-da argomento, che avvolge le operazioni sopra sull'argomento, poi i std::function si delega sua attuazione di tali operazioni all'oggetto helper.

Il layout di quell'oggetto helper dipenderà dal layout dell'argomento costruito (in quanto la sua esistenza è facoltativa e la sua implementazione dipende dall'implementazione).

Si potrebbe provare a creare un oggetto simile che supporti la serializzazione, ma un oggetto di cancellazione del tipo si basa sul fatto che il tipo da cancellare già implementa l'operazione in questione. Il che significa che è possibile solo costruire un tipo cancellato da una funzione con serializzazione da un oggetto che supporta l'interfaccia funzione-con-serializzazione almeno a livello di ducktype.

Problemi correlati