Arguments de modèle par défaut : pourquoi se limiter aux modèles de classe ?
En C, les arguments de modèle par défaut ne sont autorisés que pour les modèles de classe. Cette restriction soulève la question de savoir pourquoi de tels arguments ne peuvent pas être définis pour les modèles de fonctions membres.
Considérons l'exemple suivant :
<code class="cpp">struct my_class { template<class T = int> void mymember(T* vec) { // ... } };</code>
Dans cet exemple, une tentative est faite pour définir un type par défaut pour le paramètre de modèle T dans un modèle de fonction membre, mais cette syntaxe n'est pas autorisée par C . Au lieu de cela, les arguments de modèle par défaut sont strictement limités aux modèles de classe.
Raisonnement derrière la restriction
L'interdiction des arguments de modèle par défaut pour les modèles de fonction découle de raisons historiques. Dans les premières versions de C , les fonctions autonomes n'étaient pas entièrement intégrées au système de modèles du langage. Pour encourager l'utilisation de modèles de fonctions membres, considérés comme plus idiomatiques, les arguments de modèle par défaut ont été limités aux modèles de classe.
Cependant, cette restriction a depuis été reconnue comme une limitation, car elle différencie inutilement les modèles de fonctions membres. et des modèles de fonctions autonomes. Comme l'a souligné Bjarne Stroustrup dans un rapport de défauts :
"L'interdiction des arguments de modèle par défaut pour les modèles de fonction est un vestige mal engendré... [elle] restreint sérieusement le style de programmation en rendant inutilement les fonctions autonomes différentes des fonctions membres. ."
Mise à jour C 0x
En réponse à ces préoccupations, C 0x a introduit des arguments de modèle par défaut pour les modèles de fonctions autonomes. Ce changement permet plus de flexibilité et de cohérence dans la programmation des modèles.
Exemple
Considérez le code C 0x suivant :
<code class="cpp">template<typename Iterator, typename Comp = std::less< typename std::iterator_traits<Iterator>::value_type>> void sort(Iterator beg, Iterator end, Comp c = Comp()) { ... }</code>
Dans cet exemple , un argument de modèle par défaut est spécifié pour le paramètre de modèle Comp, permettant à l'algorithme de tri d'utiliser la fonction de comparaison moins standard par défaut.
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!