Quelle est la différence entre une classe de modèle et un modèle de classe?

Quelle est la différence entre une classe de modèle et un modèle de classe?

Ceci est un point commun de confusion pour beaucoup (y compris la page de programmation générique sur Wikipedia, certains tutoriels en C ++ et d’autres réponses sur cette page). En ce qui concerne C ++, il n’existe pas de “classe de modèle”, mais seulement un “modèle de classe”. La manière de lire cette phrase est “un modèle pour une classe”, par opposition à un “modèle de fonction”, qui est “un modèle pour une fonction”. Encore une fois: les classes ne définissent pas les modèles, les modèles définissent les classes (et les fonctions). Par exemple, ceci est un modèle , en particulier un modèle de classe , mais ce n’est pas une classe :

template class MyClassTemplate { ... }; 

La déclaration MyClassTemplate est une classe ou une classe basée sur un modèle. Il n’y a pas de propriétés spéciales d’une classe basées sur un modèle par rapport à une classe non basée sur un modèle. Les propriétés spéciales sont du modèle lui-même .

L’expression “classe de modèle” ne signifie rien, car le mot “modèle” n’a pas de sens en tant qu’adjectif lorsqu’il est appliqué au nom “classe” en ce qui concerne C ++. Cela implique l’existence d’une classe qui est (ou définit) un modèle , ce qui n’est pas un concept existant en C ++.

Je comprends la confusion commune, car elle est probablement basée sur le fait que les mots apparaissent dans l’ordre “classe de modèle” dans la langue même, ce qui est une toute autre histoire.

La différence est que le terme “classe de modèle” n’existe tout simplement pas dans le standard C ++. C’est un terme utilisé principalement par les personnes qui pensent que le terme “modèle de classe” est déroutant (comme les sociétés Qt Nokia et anciennement Trolltech).

La norme n’en a aucune conception, c’est donc aux autres peuples de faire la différence. Certaines personnes l’utilisent comme synonyme, et d’autres disent que le terme “classe de modèle” fait référence à un modèle de classe instancié ou explicitement spécialisé, ce qui le rendrait équivalent au terme “spécialisation de modèle de classe”. Historiquement, cela a eu ce sens. Le manuel de référence annoté définit à la page 343

Une classe générée à partir d’un modèle de classe est appelée classe de modèle, de même qu’une classe spécifiquement définie avec un nom de classe template comme nom

Le nom de classe de modèle non-terminal est équivalent à l’ identifiant de modèle non-terminal utilisé dans la norme actuelle et est template-name < arguments > .


Pour vous familiariser avec les termes d’aujourd’hui, ce qui est plus important que d’utiliser d’anciens termes douteux

 // (1) defines a class template template class A { }; // (2) defines a class template explicit specialization template<> class A { }; // (3) defines a class template partial specialization template class A { }; // (4) explicitly instantiates A. template class A; // (5) implicitly instantiates A (because of the member declaration) struct D { A a; }; 
  • L’ARM a appelé la classe (2) et les classes générées par (4) et (5) une classe de modèle . Je ne suis pas sûr que l’ARM soit déjà au courant des spécialisations partielles. Mais si so (3) n’était pas appelé une classe de modèle, car (3) ne définit pas une classe, mais définit un modèle.
  • Le standard actuel appelle la classe (2), et ceux générés par les spécialisations de modèle de classe (4) et (5). Et (3) s’appelle une spécialisation partielle , par opposition à une spécialisation explicite . Elle appelle aussi parfois (3) une spécialisation (3.2 / 5 – avec toutefois des clarifications croisées), bien que je trouve que ce n’est pas tout à fait clair pour moi, car elle définit une “spécialisation” comme étant une “classe, fonction ou classe” member “, qui (3) ne satisfait pas.

Une classe de modèle est liée au modèle de conception de la méthode de modèle , tandis que le modèle de classe est simplement un modèle de classe “fill-in-the-blanks”.

Bjarne Stroustrup, le créateur de C ++, dit dans son livre Le langage de programmation C ++ 4ème édition , 23.2.1 Définir un modèle:

Il y a des personnes qui font des distinctions sémantiques entre les termes modèle de classe et classe de modèle . Je ne; ce serait trop subtil: considérez ces termes interchangeables. De même, je considère le modèle de fonction interchangeable avec la fonction de modèle .

Un modèle de classe est un modèle utilisé pour générer des classes, tandis qu’une classe de modèle est une classe produite par un modèle.

Classe de modèle: classe ayant une définition générique ou une classe avec des parameters qui ne sont pas instanciés tant que le client ne fournit pas ces informations. Il est fait référence à un jargon pour plain class.simply class avec le modèle de préfixe et l’utilisation de T. Modèle de classe: La construction individuelle d’une classe est spécifiée par un modèle de classe qui est presque similaire à la manière dont les objects individuels sont construits en utilisant une classe. Il est renvoyé à un object de la classe de template Ex-classname objectname (liste d’arguments)

Le modèle de classe est une classe générique pour différents types d’objects. Fondamentalement, il fournit une spécification pour générer des classes en fonction de parameters. Chaque fois qu’un nouvel object est créé, une nouvelle classe aura lieu dans la mémoire à cet effet. Ceci est appelé instancier un modèle de classe et chaque version instanciée de la classe est appelée classe de modèle.

Jetez un oeil à cet article (de wg21 et a été publié en 1992) :

Terminologie cohérente

Une grande partie de l’argument et du désaccord à ce jour concernait la terminologie utilisée dans le chapitre décrivant les modèles. La plus fréquente a été l’application variable du «modèle de fonction» et de la «fonction de modèle» pour exprimer différentes idées et intentions. Comme aucun nom cohérent n’est appliqué, le résultat est confusion et argument.

Aux fins du présent document, sous la forme d’une proposition d’adoption formelle par le comité lors de discussions sur les modèles et aux fins de clarification de la documentation; Je propose que nous adoptions la formalisation, qu’un «-template» final décrive un ensemble de types ou de fonctions décrits par un modèle. Et qu’un ‘template-‘ principal est utilisé pour décrire la définition du modèle d’une partie d’un ‘-template’ , telle qu’une 'template-member-function' . Ainsi :-

  • ‘function-template’: Ensemble de fonctions décrites par un modèle, paramésortingque sur certaines informations de type fournies en argument à ce modèle. Par exemple :-
 template int nullcheck( T* pT ) { return ( pT != 0 ); } 
  • ‘class-template’: ensemble de classes décrit par un modèle, paramésortingque sur certaines informations de type fournies en argument à ce modèle. Par exemple :-
 template class S { int i; public: int sep_member(); int imm_member() { return 2; } } 
  • ‘template-function’: ce terme n’est plus autorisé. **
  • ‘template-class’: ce terme n’est pas autorisé. **

  • ‘member-function-template’: Ce terme n’est pas autorisé, car il décrit une propriété qui n’est pas actuellement prise en charge par la définition du modèle. En utilisant la convention de terminologie ci-dessus, cela décrirait un membre d’un template non-class, dont la définition était elle-même un modèle. Par exemple :-

 class Normal { public: template int foo(T*pT) { return ( pT == 0 ); } }; 

Cependant, comme les modèles sont actuellement limités à la scope globale, un tel modèle n’est pas valide.

  • ‘template-static-member-function’:
  • ‘template-member-function’:
  • ‘template-static-member’:
  • ‘template-static-data-member ‘ template-member ‘: termes alternatifs pour la définition d’un membre apparaissant séparément du’ class-template ‘auquel il appartient. Par exemple :-
 template int S::sep_member() { return i; }