Modèles C ++ fonctions

Noter cet article





fonction modèles c ++, fonctions c ++ templates, modèle c ++

le thème de la petite a déjà été considéré comme la surcharge de fonction en C ++. Vous avez appris à l'occasion d'écrire plusieurs fonctions avec le même nom, qui effectuent les mêmes tâches. La principale différence entre les – signature (types et / ou nombre de paramètres paramètres). Lorsque le programme démarre, le compilateur choisira, lequel des fonctions surchargées appliquer (supposant, qui est passé à la fonction)

Les modèles permettent également des fonctions pour gérer différents types de données, transmis en tant que paramètres. Mais il suffit d'écrire une définition commune d'une fonction. Voir à quoi il ressemble.

fonction modèles c ++, fonctions c ++ templates, modèle c ++

En définissant un modèle de fonction, nous avons utilisé des mots C ++ réservés: modèle et typename. modèle il indique, ce modèle sera maintenant défini. Et entre crochets après typename attribuer un nom conditionnelle du type de données. ici, au lieu du nom T, Vous pouvez assigner une (très désirable correct) nom.

Suivant est déterminé la fonction elle-même. Le type de retour précise T. paramètres: le nombre de types T, nombre et type de int. Cette fonction détermine le nombre et le pourcentage de la valeur dans le programme revient. Et le nombre, et le pourcentage passé en tant que paramètres. Par exemple, le premier paramètre on passe à une fonction entière (100). Lors du démarrage, le compilateur noter qu'actuellement T il int et remplacer les fonctions de modèle, tous ces T de int. Ainsi, la fonction du compilateur a la forme:

fonction modèles c ++, fonctions c ++ templates, modèle c ++

Nous ne voyons pas clairement, mais il fonctionne très bien. Quel que soit le nombre, nous avons pas passé à cette fonction comme premier paramètre, le compilateur va créer une instance d'un modèle de fonction pour tout appel. Ici, le premier paramètre peut être tout type de données.

En conséquence, l'écran voir le résultat de ce calcul:fonction modèles c ++, fonctions c ++ templates, modèle c ++

Au sujet de la définition d'un modèle de fonction, Je veux ajouter, en angle entre parenthèses après le mot-clé modèle permet d'enregistrer plusieurs noms conventionnels pour les types de données. Pourquoi voudriez-vous? Considérons cet exemple:

Il est nécessaire d'écrire une fonction, qui aura deux numéros, déterminer le maximum d'entre eux et le retourner dans le programme. Gardons à l'esprit, cette fonction, nous pouvons passer le nombre de différents types de. Chance et le hasard, un nombre est un nombre entier, et le second – réel. Voir ce qui se passe:

Les premier et second paramètres sont fonction définie, les paramètres de type T. Avec des appels de fonction dans les lignes 19-20 pas de problème, étant donné que les paramètres de transfert sont du même type de données. Des problèmes se posent dans la ligne 22 compiler. Et cela est compréhensible. Le compilateur se confondre. Il ne peut pas convertir le type int dans double.

шаблоны функций c++, шаблоны функций с++, template c++

Pour contourner ce problème, il est nécessaire d'écrire un autre modèle.

ici typename T_1 indique le type de paramètre, qui est transmis au premier dispositif. typename T_2 indiquent respectivement le type du second paramètre. Cette version des fonctions de définition de modèle avertir erreur, résultant dans la transmission de différents types de paramètres.

fonction modèles c ++, fonctions c ++ templates, modèle c ++

Il est important de se rappeler,si vous êtes entre crochets vous donner quelques noms pour les types classiques de paramètres de la fonction (dans cet exemple,), tous ces types de noms doivent être mentionnés dans la fonction de signature. Sinon, ne pas éviter les erreurs lors de la compilation. Par exemple, la définition d'un modèle

fonction modèles c ++, fonctions c ++ templates, modèle c ++

Elle conduit à des erreurs suivantes:

шаблоны функций c++, шаблоны функций с++, template c++

Le modèle que nous les types définis conditionnels T_1 et T_2, et la signature du type prescrit seulement T_1 .

Dans la pratique, vous pouvez répondre à la définition d'un modèle de fonction de telle manière, où, au lieu du mot-clé typename Il utilise le mot classe. par exemple:

fonction modèles c ++, fonctions c ++ templates, modèle c ++

il est équivalent à la définition de, nous avons considéré

fonction modèles c ++, fonctions c ++ templates, modèle c ++

plus tôt, avant que la norme C ++ 98, dans les modèles toujours utilisé le mot classe. Qui est le meilleur, quand il y avait un mot-clé typename , mieux utiliser. Comme il est suggère plus clairement, que les noms T_1 et T_2 Ils représentent le type.

Pour résumer. La fonction de modèle est conçu pour créer une description généralisée de la fonction. Une telle fonction peut prendre des paramètres de tout type. Le modèle permet au compilateur de générer du code pour une fonction spécifique telle que (ou des types) données, qui a été renvoyée par un appel.

Assurez-vous de regarder la vidéo. A propos des modèles avec 14 minutes:

Bulletin de nouvelles leçons sur la programmation:

14 réflexions sur "Modèles C ++ fonctions

  1. Cette question, voici un exemple, où la fonction prend deux arguments aux paramètres T1 et T2, vous avez écrit, que la fonction retourne la plus grande valeur de type T2, et si ce serait un grand nombre d', qui est un paramètre T1 ? Il est implicite du type T2 avec une éventuelle perte de données ??

    1. que, dans l'exemple illustré, la valeur de retour de type T1, et si la déclaration T2 du deuxième type, il y aura une conversion implicite à T1.
      Qu'est-ce qui se passe à la suite – il est de votre responsabilité de fournir … par exemple, Vous pouvez écrire une conversion explicite:

      return static_cast( second );

  2. la raison pour laquelle il ne peut pas être?

    modèle
    T_1 FindMax(int, deux b)
    {
    si (une > b)
    retourner un;
    else if (b > une)
    retour b;
    autre
    retour 0;
    }

  3. modèle
    T_1 FindMax(int, deux b)
    {
    si (une > b)
    retourner un;
    else if (b > une)
    retour b;
    autre
    retour 0;
    }

  4. qui est, alors pourquoi pas?

    1. donc, que règles de syntaxe, et il ne marchera pas le contrôle syntaxique.
      A syntaxiques règles modèles disent, que les types de modèles sont écrits entre crochets.

      1. Site Web a mangé un morceau de code, la raison pour laquelle il ne peut pas être?

    1. Il est donc impossible pour de nombreuses raisons:
      – type générique susmentionné à utiliser dans la signature de fonction (cette phrase est dans le texte)
      – parce que le retour (retour) différents types que vous êtes autorisé seulement parce, ce qui est inclus conversion automatique admissible – il est une mauvaise pratique…
      – mieux en revenant à écrire conversion explicite:

      – et encore mieux:

      1. P.S. que, moteur de forum (tandis que?) Il mange de tout, entre crochets … donc je ne peux pas vous montrer la bonne static_cast… , bien, regarder dans les livres.

  5. S'il vous plaît noter (il n'a pas été accentué dans le texte), que toutes, en raison du gabarit (fonction, les classes) ** ** Est traité par le préprocesseur, signifie texte makroobrabotki – antérieurement à Meilleur C ++ compiler tous les modèles a révélé une conversion de code.

Laisser un commentaire

Placez le code dans les balises: <pre class="lang:c ++ décodage:true ">VOTRE CODE</pré>