Question

Est-il possible d'écrire un modèle impure en C ++? Autrement dit, un modèle qui parfois donner un autre type ou int pour résultante les mêmes paramètres de modèle. Par exemple, est-il possible d'écrire un Foo<T> modèle où Foo<int>::type est parfois char et à d'autres float fois? Ou un Foo<T> modèle où Foo<double>::my_static_const_int est parfois 10 et d'autres fois 20?

Était-ce utile?

La solution

Il est impossible. Si vous avez un modèle qui se comporte de cette façon, il viole l'ODR et / ou d'autres règles, comme qu'une spécialisation doit être déclarée avant qu'il ne soit instancié. Donc, vous ne pouvez pas mettre une spécialisation qui serait en quelque sorte changer un membre de typedef pour le faire résoudre à un type différent pour toutes les références suivantes.

Rappelez-vous que les références Foo<T> une classe si Foo est un modèle de classe. Si le membre typedef de la classe est définie comme un type à un moment donné dans le programme, et un autre type à un autre point, alors quelque chose doit avoir été mal tourné. Voici les différentes citations standard qui concernent cette


  

Une spécialisation pour un modèle de fonction, un modèle de fonction de membre ou d'une fonction de membre ou un membre de données statiques d'un modèle de classe peut avoir plusieurs points d'instanciations au sein d'une unité de traduction. Une spécialisation pour un modèle de classe a au plus un point de instanciation au sein d'une unité de traduction. Une spécialisation pour tout modèle peut avoir des points de instanciation dans plusieurs unités de traduction. Si deux points différents de instanciation donnent une spécialisation de modèle différentes significations selon l'une règle de définition (3.2), le programme est mal formé, pas de diagnostic nécessaire.


  

Si un modèle, un modèle de membre ou membre d'un modèle de classe est alors explicitement spécialisée que la spécialisation doit être déclarée avant la première utilisation de cette spécialisation qui provoquerait une instanciation implicite ait lieu, dans chaque unité de traduction dans laquelle une telle une utilisation a lieu; n'est nécessaire de diagnostic.


(Divers "bruit" sauté)

  

[.. Diverses entités qui peuvent être définies multiple dans l'ensemble du programme ..]. Compte tenu d'une telle entité nommée D définie dans plus d'une unité de traduction, puis

     
      
  • chaque définition de D est constituée de la même séquence de jetons;
  •   
  • dans chaque définition de D, les noms correspondants, leva les yeux selon 3.4, se réfère à une entité définie dans la définition de D, ou se rapportent à la même entité, après la résolution de surcharge (13,3) et après l'appariement du modèle partiel spécialisation (14.8.3) ...
  •   
  • Si D est un modèle, et est défini dans plus d'une unité de traduction, les quatre derniers   les exigences de la liste ci-dessus sont applicables aux noms de enfermant le champ utilisés dans la définition du modèle du modèle (14.6.3), et aussi aux noms dépendants au point de instanciation (14.6.2). Si les définitions de D satisfont à toutes ces exigences, le programme doit se comporter comme s'il y avait une seule définition de D. Si les définitions de D ne satisfont pas à ces exigences, le comportement est indéfini.
  •   
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top