2010-07-23 7 views

Répondre

7

Pour éviter de répéter le code qui serait par ailleurs identique, sauf pour les différents types. Parfois, vous ne pouvez simplement pas compter sur une conversion ou une promotion implicite et vous ne pouvez pas tout mettre dans une hiérarchie d'objets.

+2

... ou pour générer du code lors de la compilation. Par exemple, générer des analyseurs à partir de C++ en ligne avec [Boost.Spirit] (http://boost-spirit.com/home/). – Staffan

1

Savez-vous même ce que sont les modèles, pour commencer? Dans la hiérarchie des concepts de langage de programmation, les modèles sont sur un plan supérieur à celui des fonctions. Une classe (/ struct) ou une fonction est correcte, mais liée à certains types. Lorsque vous écrivez un vecteur de classe, il ne fonctionne que pour un type (et ses sous-classes, s'il s'agit d'une classe), car vous êtes obligé de nommer directement le type des éléments. Mais à l'aide d'un modèle, vous n'avez pas besoin de savoir de quel type sont les éléments - ce n'est pas pertinent pour l'implémentation vectorielle, mais vous devez utiliser des modèles pour réaliser cette fonctionnalité. Cela étant dit, les modèles C++ sont très durs. Au moins ils sont là, j'apprécie qu'ils soient là, et dans les années 80 c'était tout nouveau et moderne, mais aujourd'hui, le code générique est possible sans toute la douleur d'E. messages d'erreur de modèle. Néanmoins, ils sont importants et incroyablement puissants.

En outre, les modèles C++ sont complets et un programmeur suffisamment intelligent avec beaucoup de temps libre peut faire des choses époustouflantes avec lui. Considérez: Boost (l'une des plus grandes bibliothèques C++, beaucoup diraient) est principalement des modèles. Pas de fonctions. Fonctions et classes de modèle. Modèles

+0

Cela explique quels modèles sont mais pas pourquoi les utiliser au-dessus des fonctions. – user35467

+3

Une fois que vous savez ce que sont les modèles, vous ne demandez pas pourquoi les utiliser au-dessus des fonctions. Vous pouvez toujours demander pourquoi ou quand ou comment les utiliser du tout; mon point est d'illustrer que vous n'utilisez pas de modèles "au lieu de fonctions", mais plutôt utiliser des modèles pour améliorer les fonctions (ou classes) d'existences. – delnan

+0

"... les modèles sont sur un plan supérieur à celui des fonctions." Non. Cela n'est vrai qu'en C++ à cause de certaines restrictions de conception. Une "classe" est une syntaxe spécialisée sur une fonction d'ordre supérieur qui renvoie une fermeture sur un répartiteur et des données supplémentaires. En raison de la méthode stack-the-structs-up que C++ instancie des objets à partir de classes héritées, il ne permet pas de passer un constructeur de la même manière que d'autres fonctions. Cette restriction est ce qui nécessite l'utilisation de modèles; pas parce que "les templates sont plus hauts que les fonctions". Ce sont toutes des fonctions d'ordre supérieur par essence. Tortues tout le long ... – zxq9

3

Les modèles sont une partie importante de C++, comme déjà mentionné, ils vous permettent de développer des fonctions ou des classes de type générique. Vous spécifiez le type lorsque vous les utilisez. Vous devriez vraiment apprendre les templates si, pour aucune autre raison, vous ne comprenez boost et les bibliothèques de templates standard.

Ces bibliothèques vous offrent une suite complète de conteneurs et d'algorithmes qui fonctionneront pour n'importe quel type prédéfini ou défini par l'utilisateur.

Par exemple, la classe vecteur:

vector<int> v(3);   // Declare a vector of 3 elements. 
    v[0] = 7; 
    v[1] = v[0] + 3; 
    v[2] = v[0] + v[1];   // v[0] == 7, v[1] == 10, v[2] == 17 

Le client de cette classe spécifie cela comme un vecteur de années int, mais il aurait pu facilement être un vecteur de chaînes ou de tout autre type.

1

1) Les modèles sont un moyen simple de vous enregistrer sur copier/coller le code & puis de le modifier. Fonctionne avec int, double, chaîne et tout ce qui supporte le symbole>.

Oui, vous pouvez le faire avec une macro, mais beaucoup d'exemples de modèles plus complexes ne peuvent raisonnablement pas être effectués.

2) Les classes de conteneur (vecteur, liste, carte) sont toutes modélisées.

Mon conseil, vous DEVEZ apprendre à utiliser des modèles. Il est utile de savoir comment les écrire, car ils peuvent être utiles à utiliser. (Vous pouvez faire beaucoup de choses vraiment bizarres avec des modèles, mais vous n'avez pas besoin de ce genre de choses).

1

Afin de maîtriser les modèles, il est utile de connaître les programmes generic et functional. Selon la tâche à accomplir, la programmation générique peut grandement simplifier la conception des fonctionnalités clés. Des langages comme Haskell et F # (parmi beaucoup d'autres) vous aideront à réfléchir aux problèmes d'une manière qui correspond mieux à la mécanique des gabarits.Une fois que vous êtes à l'aise avec la sémantique des fonctions en tant qu'objets, saisissez les paramètres, "itération récursive" pour ainsi dire, les valeurs ascendantes, etc., les modèles C++ deviennent seulement un moyen de surmonter les pièges du langage.

Vous pouvez faire un peu de magie avec des modèles, mais c'est certainement une bonne idée de commencer à jouer avec eux pendant votre temps libre. Les modèles peuvent aider à simplifier la complexité conceptuelle du problème, mais la mécanique de C++ peut aussi les rendre un peu compliqués (C++ 0x résoudra certains des gros ennuis). C'est certainement une bonne idée de s'assurer que toute personne avec qui vous travaillez est à l'aise avec eux. Vous devrez peut-être prouver que vous êtes digne de les utiliser dans un cadre professionnel. ;)

0

Nous surchargeons une fonction lorsque nous devons gérer différents types de données. Cette approche augmente la taille du programme. L'inconvénient n'est pas seulement que la longueur du programme est augmentée, mais aussi que plus de variables locales sont créées dans la mémoire. Un modèle surmonte en toute sécurité toutes les limitations se produisant pendant la fonction de surcharge et donne plus de flexibilité au programme.

Questions connexes