Qual è la differenza tra una classe modello e un modello di classe?
Qual è la differenza tra una classe modello e un modello di classe?
Risposte:
Questo è un punto comune di confusione per molti (inclusa la pagina di programmazione generica su Wikipedia, alcuni tutorial C ++ e altre risposte su questa pagina). Per quanto riguarda il C ++, non esiste una "classe modello", esiste solo un "modello di classe". Il modo di leggere questa frase è "un modello per una classe", al contrario di un "modello di funzione", che è "un modello per una funzione". Di nuovo: le classi non definiscono modelli, i modelli definiscono classi (e funzioni). Ad esempio, questo è un modello , in particolare un modello di classe , ma è non è una classe :
template<typename T> class MyClassTemplate
{
...
};
La dichiarazione MyClassTemplate<int> è una classe, o pedanticamente, una classe basata su un modello. Non ci sono proprietà speciali di una classe basata su un modello rispetto a una classe non basata su un modello. Le proprietà speciali sono del modello stesso .
La frase "classe modello" non significa nulla, perché la parola "modello" non ha alcun significato come aggettivo quando applicata al sostantivo "classe" per quanto riguarda C ++. Implica l'esistenza di una classe che è (o definisce) un modello , che non è un concetto che esiste in C ++.
Capisco la confusione comune, poiché probabilmente si basa sul fatto che le parole compaiono nell'ordine "classe modello" nella lingua reale, che è tutta un'altra storia.
Bjarne Stroustrup, il creatore di C ++, afferma nel suo libro The C ++ Programming Language 4th edition , 23.2.1 Defining a Template:
Ci sono persone che fanno distinzioni semantiche tra i termini modello di classe e classe modello . Io non; sarebbe troppo sottile: considera questi termini intercambiabili. Allo stesso modo, considero il template della funzione intercambiabile con la funzione template .
La differenza è che il termine "classe modello" semplicemente non esiste nello standard C ++. È un termine usato principalmente da persone che pensano che il termine "modello di classe" sia fonte di confusione (come le società Qt Nokia e precedentemente Trolltech).
Lo Standard non ne ha il concetto, quindi spetta ad altre persone fare la differenza. Alcune persone lo usano come sinonimi, e altri dicono che il termine "classe modello" si riferisce a un modello di classe istanziato o esplicitamente specializzato, il che lo renderebbe equivalente al termine "specializzazione modello di classe". Storicamente, aveva questo significato. Il Manuale di riferimento annotato definisce a pagina 343
Una classe generata da un modello di classe è chiamata classe modello, così come una classe specificatamente definita con un nome-classe-modello come nome
Il nome-classe-modello non-terminale è equivalente all'id- modello non-terminale usato nello standard odierno e si riduce template-name < arguments >.
Per familiarizzare con i termini odierni, che è più importante che usare vecchi termini dubbi
// (1) defines a class template
template<typename T> class A { };
// (2) defines a class template explicit specialization
template<> class A<int> { };
// (3) defines a class template partial specialization
template<typename T> class A<T*> { };
// (4) explicitly instantiates A<char>.
template class A<char>;
// (5) implicitly instantiates A<short> (because of the member declaration)
struct D { A<short> a; };
Una classe modello è correlata al modello di progettazione del metodo modello , mentre un modello di classe è solo un modello di classe "riempi gli spazi vuoti".
Un modello di classe è un modello utilizzato per generare classi mentre una classe modello è una classe prodotta da un modello.
Classe modello: una classe che ha una definizione generica o una classe con parametri che non viene istanziata fino a quando le informazioni non vengono fornite dal client. Si fa riferimento a un gergo per semplici template. Semplice classe con prefisso template e uso di T. Modello di classe: la costruzione individuale di una classe è specificata da un modello di classe che è quasi simile al modo in cui i singoli oggetti vengono costruiti utilizzando una classe. Si riferisce a un oggetto della classe template Ex- classname nome oggetto (elenco di argomenti)
Il modello di classe è una classe generica per diversi tipi di oggetti. Fondamentalmente fornisce una specifica per la generazione di classi basate su parametri. Ogni volta che viene creato un nuovo oggetto, una nuova classe avrà luogo nella memoria a tale scopo. Questa operazione è chiamata creazione di un'istanza di un modello di classe e ogni versione della classe di cui è stata creata un'istanza è chiamata classe modello.
Dai un'occhiata a questo documento (dal wg21 ed è stato pubblicato nel 1992) :
Terminologia coerente
La maggior parte dell'argomento e del disaccordo fino ad oggi è stata relativa alla terminologia utilizzata nel capitolo che descrive i modelli. La più frequente è stata l'applicazione variabile di 'modello-funzione' e 'funzione-modello' per esprimere idee e intenti diversi. Poiché non viene applicata alcuna denominazione coerente, il risultato è confusione e argomento.
Ai fini del presente documento, come proposta di adozione formale da parte della commissione nelle discussioni sui modelli e ai fini di chiarimento della documentazione; Propongo di adottare la formalizzazione, che un '-template' finale descrive un insieme di tipi o funzioni descritti da un modello. E che un "modello-" iniziale viene utilizzato per descrivere la definizione del modello di parte di un "modello" , come un
'template-member-function'. Quindi: -
- 'modello di funzione': un insieme di funzioni descritte da un modello, parametriche su alcune informazioni di tipo fornite come argomento a quel modello. Per esempio :-
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
- 'class-template': un insieme di classi descritte da un template, parametriche su alcune informazioni di tipo fornite come argomento a quel template. Per esempio :-
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
- 'template-function': questo termine non è più consentito. **
'template-class': questo termine non è consentito. **
'modello-funzione-membro': questo termine non è consentito, poiché descrive una proprietà non attualmente supportata dalla definizione del modello. Usando la convenzione terminologica sopra, questo descriverebbe un membro di un modello non di classe, la cui definizione era essa stessa un modello. Per esempio :-
class Normal { public:
template<class T> int foo(T*pT)
{ return ( pT == 0 ); }
};
Tuttavia, poiché i modelli sono attualmente limitati all'ambito globale, tale modello non è valido.
- 'template-static-member-function':
- 'template-member-function':
- 'template-static-member':
- 'template-static-data-member ' template-member ': termini alternativi per la definizione di un membro che appaiono separati dal' class-template 'a cui appartiene. Per esempio :-
template<class T> int S<T>::sep_member()
{ return i; }
Normalclasse che descrivi sopra: non sapevo che un simile modello di funzione membro fosse proibito. È accettato da tutti i compilatori che ho provato. Cosa mi manca?