Sto leggendo su boost type erasure
e sto cercando di capire il potenziale utilizzo. Mi piacerebbe esercitarlo un po 'mentre sto leggendo tonnellate di documenti sull'argomento (sembra grande). La più citata area di applicazione che è in rete/scambiare dati tra client e server. Puoi suggerire qualche altro esempio o esercizio in cui posso giocare con questa libreria?pratica e scoperta di Boost Type Erasure
risposta
Tipo La cancellazione è utile in una quantità straordinaria di situazioni, al punto in cui può essere effettivamente considerata una funzionalità linguistica fondamentalmente mancante che collega gli stili di programmazione generici e orientati agli oggetti.
Quando definiamo una classe in C++, che cosa realmente stiamo definendo è sia una molto specifica type
e molto specifico interface
, e che queste due cose non devono necessariamente essere in relazione. A type
si occupa dei dati, dove il interface
si occupa delle trasformazioni su quei dati. Il codice generico, ad esempio nell'STL, non si preoccupa di type
, si occupa di interface
: è possibile ordinare qualsiasi contenitore o sequenza simile a un contenitore utilizzando std::sort
, purché fornisca confronto e iteratore interface
.
Sfortunatamente, il codice generico in C++ richiede il polimorfismo in fase di compilazione: templates
. Questo non aiuta con cose che non possono essere conosciute fino al runtime, o cose che richiedono un'interfaccia uniforme.
Un semplice esempio è questo: come si memorizzano un numero di tipi diversi in un unico contenitore? Il meccanismo più semplice sarebbe quello di memorizzare tutti i tipi in un vuoto *, magari con alcune informazioni di tipo per distinguerli. Un altro modo è riconoscere tutti questi types
hanno lo stesso interface
: recupero. Se potessimo creare un'unica interfaccia per retrieval
, quindi specializzarla per ciascun tipo, sarebbe come se una parte dello type
fosse stata cancellata.
any_iterator
è un altro motivo molto utile per fare questo: se hai bisogno di iterare su una serie di diversi contenitori con la stessa interfaccia, è necessario cancellare il type
del contenitore fuori dalla type
del iteratore. boost :: any_range è un sottile miglioramento di questo, estendendolo dagli iteratori agli intervalli, ma l'idea di base è la stessa.
Insomma, ogni volta che è necessario passare da più types
con un simile interface
ad un singolo type
con un singolo interface
, avrete bisogno di una qualche forma di cancellazione del tipo. È la tecnica runtime che identifica i modelli di tempo di compilazione.
Ciao. Nel frattempo, per riferimento ho letto anche quanto segue da Thomas Becker http://www.artima.com/cppsource/type_erasure.html http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/any_iterator.html –
Entrambi risorse eccellenti, ma ho pensato che potreste desiderare di conoscere la necessità più generale di cancellare i caratteri, al di là di 'any' o' any_iterator' o 'any_container'. Per quanto i puntatori di funzioni dei membri esistano solo per implementare i delegati, è possibile che le funzioni virtuali esistano principalmente per consentire la cancellazione dei tipi. È quel fondamentale di un concetto. – Alice
pagina 16ff di http://accu.org/var/uploads/journals/Overload116.pdf ha un articolo su dyamic C++ che utilizza la cancellazione di tipo – doctorlove
Lo sto leggendo proprio ora. Grazie per i suggerimenti. –
Direi per il networking, il polimorfismo di runtime classico è un idioma più appropriato rispetto alla cancellazione di tipo. La cancellazione dei caratteri è ottima per gestire i deletatori e gli allocatori in 'std :: shared_ptr', comunque. –