Differenza tra istanziazione e specializzazione in modelli c ++

Qual è la differenza tra specializzazione e istanziazione nel contesto di modelli C ++. Da quello che ho letto finora è quanto ho capito sulla specializzazione e l’istanziazione.

template  struct Struct { T x; }; template struct Struct  //specialization { //code }; int main() { Struct  s; //specialized version comes into play Struct  r; // Struct  is instantiated by the compiler as shown below } 

Istanziazione di Struct dal compilatore

 template  struct Struct { float x; } 

La mia comprensione dell’istanza e della specializzazione del template è corretta?

4 concetti:

(implicito) istanziazione : questo è ciò che tu definisci istanziazione

istanziazione esplicita :: questo è quando si dice al compilatore di creare un’istanza del modello con determinati tipi, come questo

 template Struct; //used to control the PLACE where the template is inst-ed 

Specializzazione (esplicita): questo è ciò che definisci specializzazione

specializzazione parziale questo è quando si dà una definizione alternativa a un modello per un sottoinsieme di tipi, come questo:

 template class Struct {...} //partial specialization for pointers 

Qual è la differenza tra specializzazione e istanziazione nel contesto di modelli C ++?

Normalmente (nessuna specializzazione presente) il compilatore creerà le istanze di un modello quando vengono utilizzate, sostituendo i parametri del modello effettivo ( int nel proprio esempio) per i parametri del modello formale ( T ) e quindi compilando il codice risultante.

Se è presente una specializzazione , quindi per il (o più) parametro (i) di template speciale specificato da tale specializzazione, è necessario utilizzare l’implementazione della specializzazione invece di ciò che il compilatore creerebbe.

Una specializzazione del modello modifica effettivamente il comportamento del modello per un tipo specifico. ad esempio, convertire in una stringa:

 template std::string convertToString( const T& t ) { std::ostringstream oss; oss << t; return oss.str(); } 

Specializziamoci sul fatto che quando il nostro tipo è già una std :: string poichè è inutile passare attraverso ostringstream

 template<> std::string convertToString( const std::string & t ) { return t; } 

Puoi anche specializzarti per le lezioni.

Ora istanziazione: questo è fatto per consentire di spostare la compilazione per alcuni tipi in una unità di compilazione. Questo può farti risparmiare tempo di compilazione e talvolta anche code-bloat. Diciamo che facciamo quanto sopra in una class chiamata StringConvert piuttosto che una funzione.

 template class StringConvert { public: // 4 static functions to convert from T to string, string to T, // T to wstring and wstring to T using streams }; 

Convertiremo un sacco di interi in stringhe in modo che possiamo istanziarlo: mettilo all'interno di un'intestazione

  extern template class StringConvert; 

Metti questo in una unità di compilazione:

  template class StringConvert; 

Nota che quanto sopra può anche essere fatto (senza l'extern nell'intestazione) con funzioni che in realtà non sono implementate in linea. Una delle tue unità di compilazione le implementerà. Tuttavia, il tuo modello è limitato solo ai tipi istanziati. A volte fatto quando il modello ha un distruttore virtuale.

Panoramica

  • Specializzazione: la class, la funzione o il membro della class che si ottiene quando si sostituiscono gli argomenti del modello nei parametri del modello di un modello di class o di un modello di funzione.

  • Istanziazione: l’atto di creare una specializzazione da un modello o da un membro del modello di class. La specializzazione può essere creata da una specializzazione parziale, da un membro del modello di class o da un modello di class o funzione primaria.

Una specializzazione esplicita è quella che definisce la class, la funzione o il membro in modo esplicito , senza un’istanza.

In c ++ 11.

esemplificazione:

Crea un’istanza del modello con determinati argomenti del modello

 template  struct test{ T m; }; template test;//explicit instantiation 

quale risultato in una definizione di una struct con un test identificazione test

 test a;//implicit instantiation 

se template struct test è stato istanziato con l’argomento T = int before (esplicito o implicito), quindi è solo una struct instantiation. Altrimenti istanzia il template struct test con l’argomento T = int prima implicitamente e quindi istanzia un’istanza di struct test

specializzazione:

una specializzazione è ancora un modello , hai ancora bisogno di istanziazione per ottenere il codice reale.

 template  struct test{ T m; }; template <> struct test{ int newM; } //specialization 

La più utile della specializzazione dei modelli è probabilmente la possibilità di creare modelli diversi per diversi argomenti del modello, il che significa che è ansible avere diverse definizioni di class o funzione per diversi argomenti del modello .

 template<> struct test{ int cm; }//specialization for char test a; a.cm = 1; template<> struct test { int lm; }//specialization for long test a; a.lm = 1; 

Oltre a queste specializzazioni di template complete di cui sopra, c’è (solo template di class) anche le specializzazioni di template parziali .

 template struct test {}; template  struct test{};//partial specialization for const T template  struct test {}; template  struct test{};//partial specialization for A = int 

Un modello specializzato non è più solo un modello. Invece, è una class reale o una funzione reale.

Una specializzazione è da una istanziazione o una specializzazione esplicita, cf 14.7.4 di seguito.

Un’istanza è basata su una definizione di modello primaria. Una istanziazione modello di class implicita di esempio,

 template class foo {} foo foo_int_object; 

Un esempio di istanza del modello di class esplicita,

 template class foo; 

Una specializzazione esplicita ha una definizione diversa dal suo modello principale.

 template<> class foo {} 

// estratto dallo standard

14 modelli

14.7 Creazione di modelli e specializzazione

4 Una specializzazione di template istanziata può essere implicitamente istanziata (14.7.1) per una data lista di argomenti o essere esplicitamente istanziata (14.7.2). Una specializzazione è una class, una funzione o un membro della class che è istanziato o esplicitamente specializzato (14.7.3).