2012-09-11 12 views
5

Qualcuno può dare un suggerimento come fa espressioni di processo compilatore comeC++ modello di ordine codice di analisi/CRTP

class DerivedA: public ParentTemplateClass<DerivedA>{ 
} 

Per mee assomiglia:

il padre di questo ragazzo è un "figlio" di questo ragazzo

Voglio dire, non è ovvio per me come "parsing" della classe DerivedA possa essere completato SENZA conoscere esattamente la "descrizione" della classe genitore. Sembra che non possa. Quindi la classe genitore deve essere elaborata prima dei bambini, ma in tale situazione il genitore dipende dai figli ... e io sono bloccato lì.

Sì, alcuni articoli sul Web descrivono l'utilizzo di tale elemento, ad es. un articolo su Pattern modello che ricorre in modo curiosamente ( http://en.wikibooks.org/wiki/More_C++_Idioms/Curiously_Recurring_Template_Pattern) ma non è una specie di standart o smth vicino. Ci deve essere una chiara descrizione del comportamento come l'ordinamento delle operazioni no?

RISPOSTA: Thnx a tutti. Sì, l'analogia con la declinazione in avanti mi sembra legittima a smettere di danneggiare il mio cervello. I modelli sono ancora stato dell'arte per me causa della sua natura sottolingua nascosti e non posso proprio g ++ -E :)

+1

Pensateci a questo punto come se fosse una dichiarazione in avanti. – PlasmaHH

+0

Penso a questo come "Il padre del ragazzo è definito in termini di questo specifico figlio."Non sono un fan del CRTP - sospetto che sia troppo usato - ma l'interpretazione di un codice CRTP specifico è relativamente semplice: i modelli sono sempre completamente espansi prima che gli oggetti digitati possano essere istanziati – aSteve

+0

" I modelli sono sempre completamente espansi prima gli oggetti dattiloscritti possono essere istanziati "sì, sembra legittimo. Una specie di effetto sfocato per me è dovuto al fatto che temaplate è stato istanziato durante la compilazione e non nella pre-elaborazione. – sohel

risposta

6

Dopo il codice dice class DerivedA, il simbolo DerviedA viene dichiarato. Al punto può essere usato come parametro del template. I compilatori C++ fanno diversi passaggi sul codice, quindi a quel punto nell'analisi il compilatore "crederà" che la tua intenzione era corretta e che alla fine otterrà la definizione di quella classe (quando sta per creare un'istanza del modello, cioè in realtà usa quel tipo). In caso contrario, si lamenterà a quel punto. Una cosa simile accade se hai usato una classe dichiarata inoltrata in una dichiarazione ma non hai fornito una definizione prima di usarla.

1

Penso che per capire come potrebbe funzionare, è necessario comprendere meglio i modelli C++ in generale, oltre al modello di modello ricorrente. Qualcun altro può probabilmente rispondere meglio di me, ma so che C++ non è in grado di analizzare da solo una definizione di classe template. Crea un'istanza del modello ogni volta che viene utilizzato nel codice. Se ogni classe era in un separato file include, pensa a come questo:

#include "ParentTemplateClass.h" // C++ initially validates the template class definition's syntax. 
#include "DerivedA.h" // First use of ParentTemplateClass - 
         // at this point it becomes fully instantiated. 

Il parser C++ sarà inizialmente convalidare la sintassi del modello quando si vede la definizione del modello. Quindi, quando il modello viene utilizzato come base di DerivedA, l'analisi continua e il modello viene completamente istanziato. Questa è, ovviamente, una vista semplificata dell'analisi che il compilatore C++ farà, e sono sicuro che i dettagli variano a seconda del compilatore. Vedi anche http://womble.decadent.org.uk/c++/template-faq.html#disambiguation.

3

Nel punto in cui viene creato il modello, DerivedA è incompleto; è stato dichiarato, ma non completamente definito. I tipi incompleti possono essere utilizzati in vari modi: ad esempio, è possibile dichiarare puntatori o riferimenti ad essi, dichiarare funzioni con essi come tipi di ritorno o di parametro e alcune altre cose. Non puoi creare oggetti, ereditarli, accedere ai loro membri o, in generale, fare qualcosa che richiede più informazioni rispetto al solo nome della classe.

Fintanto che il modello di classe fa solo queste cose, non ci sono problemi.

Problemi correlati