Maison > développement back-end > C++ > le corps du texte

Pourquoi les arguments de modèle par défaut sont-ils limités aux modèles de classe en C ?

Susan Sarandon
Libérer: 2024-11-01 17:29:30
original
521 Les gens l'ont consulté

Why are Default Template Arguments Restricted to Class Templates in C  ?

Pourquoi les arguments de modèle par défaut sont limités aux modèles de classe

En C, les arguments de modèle par défaut ne sont autorisés que sur les modèles de classe mais pas sur les modèles de fonction. Cette restriction peut sembler surprenante, mais elle a plusieurs raisons.

Arguments de modèle par défaut pour les modèles de classe

Les arguments de modèle par défaut permettent aux modèles de classe de fournir une valeur par défaut pour certains paramètres. Cela peut être utile lorsqu'il est peu probable que la valeur par défaut change pour la plupart des instances du modèle. Par exemple, un modèle de classe pour un algorithme de tri pourrait avoir un argument de modèle par défaut pour la fonction de comparaison utilisée dans le tri.

Restriction pour les modèles de fonction

Cependant, les arguments de modèle par défaut ne sont pas autorisés pour la fonction modèles car ils introduiraient une ambiguïté. Considérons l'exemple hypothétique suivant :

<code class="cpp">struct my_class {
  template<class T = int>
  void mymember(T* vec) {
    // ...
  }
};</code>
Copier après la connexion

Dans cet exemple, il ne serait pas clair si T est le type par défaut pour la fonction mymember ou pour le modèle my_class lui-même. Cette ambiguïté pourrait conduire à des erreurs subtiles dans le code.

Avènement de C 11

Avant C 11, l'interdiction des arguments de modèle par défaut pour les modèles de fonctions était une limitation importante. Cependant, C 11 a introduit une nouvelle fonctionnalité appelée « alias de type » qui nous permet de définir des alias pour les types. Cela fournit une solution de contournement au manque d’arguments de modèle par défaut pour les modèles de fonctions. Par exemple, l'exemple ci-dessus pourrait être réécrit comme suit :

<code class="cpp">struct my_class {
  typedef int default_type;
  template<class T = default_type>
  void mymember(T* vec) {
    // ...
  }
};</code>
Copier après la connexion

Bien que les alias de type ne soient pas aussi pratiques que les arguments de modèle par défaut, ils offrent une fonctionnalité similaire et nous permettent de surmonter les limitations de la norme C actuelle. .

Le point de vue de Bjarne Stroustrup

Dans un rapport de défauts, Bjarne Stroustrup, le concepteur original de C , a exprimé son point de vue sur l'interdiction des arguments de modèle par défaut pour les modèles de fonction :

L'interdiction des arguments de modèle par défaut pour les modèles de fonction est un vestige malencontreux de l'époque où les fonctions autonomes étaient traitées comme des citoyens de seconde classe et exigeaient que tous les arguments de modèle soient déduits des arguments de fonction plutôt que spécifiés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal