2013-08-16 16 views
6

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

+0

pagina 16ff di http://accu.org/var/uploads/journals/Overload116.pdf ha un articolo su dyamic C++ che utilizza la cancellazione di tipo – doctorlove

+0

Lo sto leggendo proprio ora. Grazie per i suggerimenti. –

+0

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. –

risposta

17

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.

+1

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 –

+2

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