Pourquoi utiliser des templates ?
Qui est le pays le plus pauvre du monde ? Ainsi, le Burundi arrivait en tête des pays les plus démunis, avec un PIB par habitant de 269 dollars américains.9 août 2022 Où trouver mon adresse IP sur mon portable ? Trouver son adresse IP et son adresse MAC – Android Pourquoi couper le Wi-Fi la nuit ? En plus de pouvoir restreindre la connexion wifi de votre box chez vous durant certaines heures, cette fonctionnalité de désactivation automatique du wifi permet de réduire la consommation électrique de votre box internet et donc de faire des économies d’énergie.28 sept. 2022 Quel logiciel pour CSS ? Free CSS Toolbox est un logiciel gratuit permettant l’édition de code CSS. Si vous développez des sites qui utilisent des feuilles de style CSS, Free CSS Toolbox peut vous aider à gagner du temps et augmenter votre productivité. Comment protéger sa marque gratuitement ? Le dépôt de marque se réalise en ligne, sur le site internet de l’INPI, l’Institut national pour la propriété industrielle. Toute personne physique ou morale peut procéder à un dépôt de marque. Dans certains cas, le recours à un mandataire s’avère obligatoire.15 sept. 2020
nous allons dans ce nouveau tuto nous intéresser à la notion de fonctions template on parle aussi de fonctions génériques une fonction tempête ou bien une fonction générique c’est une fonction pour laquelle nous allons réussir à faire varier les types de données sur lesquelles nous allons pouvoir l’invoquer afin de mieux comprendre le concept je vous propose de reprendre notre workspace éclipse vous pouvez y crée un nouveau projet nous l’appellerons pourquoi pas 07 template fonctionne et nous allons donc commencer à taper ces quelques premières lignes notez que j’ai pris un petit peu d’avancé histoire de faire un rappel sur un concept que nous avions vu durant le tuto sur les fonctions inline effectivement nous avions introduit la notion de maquereaux paramétrer qui en vérité est un concept c ne l’oublions pas une bacrot paramétrer c’est une macro pour lesquelles nous en allons accepter un certain nombre de paramètres et donc ici bas notre macro mini qui travaille sur deux valeurs a et b renverra son corps qui sera si elle est inférieure à b alors je renvoie à sinon je renvoie b n’oubliez pas la macro paramétré en vérité et traités non pas par le compilateur ces puces puisse mais par le prêt processeur ce qui veut dire que ici bas le prêt processeur va injecter le corps de cette maquereau en lieu et place de mini nous avons deux entiers intat égal 3 ints beghal 6 a priori comme ça on aurait envie de dire minimum de 3 et 2 6 3 + 2 ça devrait faire 5 regardez je lance ce programme et oui nous avons un petit souci effectivement ce n’est pas la valeur 5 qui nous est retourné bien la valeur 3 pourquoi comme je vous disais le pré processeur va remplacer l’appel à la macro par le corps de celle ci ce qui veut dire que ici nous allons avoir int résulte égal et on va injecter en lieu et place de la paix la mini ça auxquels nous ajouterons 2 et le problème c’est qu’on s’est fait avoir par rapport à la priorité de l’opérateur plus effectivement il est prioritaire par rapport au reste ce qui veut dire que le plus ne s’appliquera que dans le cas où le minimum des paramètres à ce rabais est donc si ces acquis et le plus petit bond renvoie juste à donc à l’époque nous avions dit que effectivement la bonne façon de définir une macro paramétrer c’était complètement l’apparenté j’ai regardé cette fois ci j’ai mis les parenthèses et donc si je relance ici maintenant nous calculons bien la valeur attendue à savoir la valeur 5 donc à cause de cette source d’erreurs potentielles il a été dit qu’il n’est pas une bonne idée d’utiliser les maquereaux paramétrer alors pour autant cette macro avec deux avantages le premier avantage c’est comme le corps de la macro est injectée en lieu et place de l’appel ça permettait d’ optimiser pour des petits traitement d’appoint comme des minimums des maximums où ce genre de de traitement c’est vrai que la macro c’était efficace bon mais nous avions déjà vu que ces puce puce rajouter le mot-clé in line pour pallier à cette difficulté donc on peut définir une fonction inline du coup c’est pas vraiment une fonction et son corps sera injectée en lieu et place de l’appel c’est une bonne chose mais le deuxième avantage de cette macro c’est que ici nous avons jamais tibet a et b donc dans l’absolu la macro peut marcher avec n’importe quoi pour peu qu’on fournisse un opérateur d’infériorité qui permet de comparer à -b regardez ici je définis un double d un égal 3.11 double des 2 égale 7.8 et j’affiche le minimum de d1 d2 et puis je rajoute un petit retour à la ligne eh bien regardez il n’y a pas de souci c’est bien la valeur 3.1 qui a été calculée donc mini a bien pu être appelée aussi bien sûr des entier que sur des doubles je pourrais rajouter comme ça un grand nombre de types de données pour lesquels cela marcherait très bien regarder ainsi je modifie d1 maintenant c’est bien 7.8 qui va nous être retournés par fait bon bain pour autant c’est pas une bonne façon de procéder un que d’utiliser des macros à cause du risque de la mauvaise utilisation des parenthèses du coup en lieu et place de ça parce que je devais définir c’est une fonction template donc une fonction génériques cette fonction template cette fonction générique accepte donc ici pour nous un seul type c’est le type pour les deux paramètres ce type on va les introduire via le mot knight name et donc on va dire c’est un type générique c’est un type qui peut varier du coup le corps de notre fonction serait mini elle renverrait un t elle accepterait deux paramètres a et b de type t’es bien entendu la tension est donc si à est inférieure à b alors je renvoie à sinon je renvoie bien regardé j’ai mon template je relance mon programme qui a priori a parfaitement compiler et donc la valeur calculée c’est bien 5 donc effectivement ici nous ne sommes pas embêtés avec les parenthèses pour autant tout marche bien alors pourquoi parce qu’en vérité le template n’est pas pris en charge par le pres processeur contrairement à la macro c’est le compilateur qui a traité le template donc il le voit comme comme une fonction si vous voulez et donc il sait qu’il doit l’évaluer en priorité avant de faire le plus de alors pourriez me dire oui mais on a régressé parce que du coup ici on a pu l’optimisation qui qu’on avait comme je vous disais il ya quelques minutes rien ne vous empêche de définir un template inline ya aucun problème et dans ce cas là bas normalement n’a pu l’appel de fonction on a le corps de l’âme et de la fonction qui va être directement remplacé à ce niveau là pour autant votre mini il est générique et donc on peut s’abstraire ça marche aussi bien sur des sentiers des doubles ou sur d’autres types de données néanmoins il faut faire attention regardez je vais rajouter un troisième cas ici nous avons inclus string pour la manipulation d’objets de type chaînes de caractères en c++ et je vais donc déclarer deux variables et ce terrain qui vote auto et une autre variable de type string elle s’appelle str 2 et elle vaut tata ce que je cherche à faire c’est bien entendu encore une fois de calculer le minimum des deux très bien et je vous renvoie un petit retour à la ligne après parfait regardez a priori tour au compile correctement je relance mon programme comme ça j’ai envie de dire tout à l’air de bien fonctionner le minimum de ces deux chaînes c’est bien tard la plus petite ses chaînes car il commence par un parfait en tout cas dans l’ordre du dictionnaire il n’y a pas de souci c’est bien tata qui devrait apparaître avant totaux très bien pour autant là on a fait une petite bêtise effectivement ça c’est une donnée un petit peu plus complexe qu’un entier ou qu’un double là on parle d’un objet et cet objet pour pouvoir le passer en paramètre à min à noter qu’il va falloir faire des copies parce que pour le moment nous avons défini un template qui acceptent les paramètres par copie bon bah pour des strings c’est pas forcément une bonne idée donc je vous suggère de faire attention ce qu’il faut comprendre c’est qu un template potentiellement c’est un modèle de code qui va nous permettre de générer une infinité de fonction alors effectivement pour caen et passage de paramètres sur la pile faut-il avoir une vraie fonction dans ce cas là nous allons pouvoir gérer une infinité de vraie fonction la question c’est qu’est ce que c’était c’est vrai que si c’était ninh thu un double ça va c’est plus ou moins optimisé dans le cas d’objets plus complexe ça risque de vous coûter cher donc je vous préconise de toujours réfléchir un temple est dans le pire des cas dans le pire des cas on sait pas trop ce que c’est et la taille de thé c’est quelque chose de complexe de quelque chose de conséquent donc je préfère le prendre pas référence on est bien d’accord une référence par derrière se cache en vérité un pointeur donc nous n’accepterons aucun pointer vers le donnait à manipuler comme il y aura un pointeur déguisés derrière cette référence n’oubliez pas de rajouter le constat c’est à dire que durant l’appel de notre fonction ne voulons pas que n’y a ni b soit modifié on garantit sa l’utilisateur on compare les deux mais on ne modifie ni l’un ni l’autre regardez effectivement tour marche bien et donc nous avons optimisé le passage de paramètres à noter qu’on peut avoir le même type de réflexion y compris sur la valeur de retour parce que l’actuel mans alors de retour est passé par copie si je veux envoyer une référence vers le plus petit des deux pourquoi pas on peut envisager mettre une référence à ce niveau là mais là attention regardez j’ai sauvegardé et du coup là ça ne compile plus pourquoi ça ne compile plus parce que ici nous avons des références constantes et nous renvoyons une référence non constante donc ils vous disent eric s’il ya une incompatibilité de type c’est pas bien méchant il suffit ici d’utiliser l’opérateur de caste const caste et cet opérateur de cast est prévu pour retirer le qualificateur de constance regardez je dis ok durant l’appel de garantie que n’y a ni b sera modifié mais en sortie je peux vouloir renvoyer quelque chose qui ne soit pas qu’ils ne soient pas constant donc dans ce cas là je renvoie une référence sur un teint parfait je relance mon programme et donc noté ma foi tout fonctionne correctement alors du coup arriver à ce stade j’ai envie d’insister sur un point tout comme nous l’avions dit pour les maquereaux paramétrer ou ou les fonctions online au passage si vous voulez déportés ce mini au niveau d’une librairie il nous faudrait dans ce cas là un nouveau fichier point h je l’appelle miley bi poin h pourquoi pas et on peut envisager de déplacer ces éléments au niveau de ce point h et puis ici pourquoi pas nous pourrions avoir un diesel cloud de notre librairie vous avez vu un pour inclure ma librairie j’ai pas tout apg et efficace je mets double guillemets parce que c’est une librairie qui fait partie du projet c’est pas une librairie système donc je ne mets pas les chevrons et à partir de là vous taper contre l’espace ça permet d’avoir l’assistance cours de frappes est donc ici j’inclus mains libres comme j’en ai qu’une seule dans mon projet c’est elle qui m’a proposé par des veaux très bien maintenant revenons sur notre librairie à proprement parler dans notre librairie ici j’ai défini donc un template est ce qu’il faut comprendre c’est comme template c’est un modèle de code ce modèle de code servira lors de l’appel ici il connaît pas min donc il va dire est-ce que j’ai une fonction mini qui accepte deux entier la réponse est non donc il va dire ok ai-je un template qui me permettrait de produire une fonction à partir de deux entier cette fois ci la réponse est oui il ya bien un template et donc du coup comme il a besoin de générer la fonction à ce moment très précis lui la seule chose qu’ils voient c’est le diaz include donc il faut que le template le modèle de code baisse soit fournie au moment de l’utilisation donc un template ce n’est pas une fonction c’est un modèle de fonction ce modèle se déclare dans un point h et uniquement dans un point h à l’instar des fonctions online ou bien des macros c’est un petit peu la même idée donc il n’y a pas d’erreur contrairement à des fonctions plus classique où là il faut forcément implémenter la fonction dans un cpp laon par contre il faudra bien que votre temps plein soit défini dans un point h très bien donc là bas nous avons notre librairie qui correctement utilisés et donc normalement tour fonctionne correctement et nous avons encore une fois les bonnes données qui sont qui sont calculées donc un template se définit forcément dans un point h dans un tube dans le tuto suivant nous parlerons de classe template une classe bien entendu définissant des méthodes il en est il ce sera la même chose il en sera de même vos méthodes devront être déclarés dans le point h de votre classe template on verra ça plus tard revenons sur l’exemple de notre fonction et je voulais rajouter une petite difficulté imaginons j’ai ici une variable first elle vaut 5 elle est de type entier j’ai une seconde variable mais cette fois ci cette variable sera de type double je vais l’appeler secondes et secundo 18.3 et imaginons que je cherche à afficher le minimum de first et deux secondes à noter que j’ai une petite erreur de compilation live vous dit qu’il n’arrive pas à déduire les types parce qu’il a un conflit lui ce qu’il voit c’est que le temple est il ya qu un seul et unique type qui peut considérer donc si vous voulez là il se dit basse assez typé insee assez typé double donc j’aurai besoin normalement des tempêtes à deux paramètres génériques or ici nous n’avons qu’un donc du coup ça a suffi à le mettre ko et du coup il est dans l’incapacité de de pouvoir compilé votre programme alors c’est pas bien méchant sachez que si vous avez une incompatibilité de type à ce niveau là mais que néanmoins il ya quand même quelques liens entre entre vos types vous pouvez ici prendre le contrôle et lui dire ce que je veux c’est générer une fonction min à partir d’un temple est qui est basée sur double bombe a doublé double ça y’a pas de problème int étant compatible avec double ça va marcher regarder je sauvegarde mon fichier le compilateur dont vient de prendre la main il vient de reconstruire mon programme et tout se passe bien et là il ya plus d’ambiguïté c’est bien un mini sur double qui va être invoquée impeccable 5 est bien plus petit que 8 points 3 si je mets 15 à 8.3 devait être retournées et espérons le parfait donc 1 à savoir des fois vous pourrez avoir des petites difficultés parce que vous n’avez pas des types équivalent bon ben si ils sont compatibles néanmoins vous pouvez prendre le contrôle et spécifier le type pour lequel vous voulez produire une fonction à partir de ce temple est très bien donc là dans notre exemple nous avons trois fonctions qui ont été utilisés nous avons une fonction qui a été produite pour le typique nous avons une haute fonction qui a été produite pour le type double et nous avons une troisième fonction qui a été produite pour le type string par contre ici nous avons réutilisé la fonction qui avait été produit à ce moment là parce que nous avions déjà un minimum entre double parfait partir de la dernière petite chose que je voudrais rajouter ici donc nous avons notre mini on ne vient de dire a priori il peut marcher avec n’importe quoi pour peu que ce n’importe quoi fournissent un opérateur d’infériorité très bien nous allons tester un dernier exemple je vais travailler avec des courses de chars étoiles donc ici je vais faire un constat chars étoiles c est ce terrain c’est pour parce que c’est une chaîne c’est un plat et donc azerty très bien je vais faire un constat chars étoiles stc str 2 mais pourquoi pas qwerty très bien et à partir de là je voudrais afficher le minimum de cs terrain et de cs tr min excusez moi petite faute de frappe voilà qui est corrigé et regardez est ce que ça marche bien voilà comme ça si on est un petit peu trop rapide on aurait tendance à dire oui ça calcule bien avertis mais regardez petite farce je prends cette variable et je la déplace ici donc a priori tout compile bien parfait on a bien cstr 1 cs tr 2 je cherche à calculer le minimum je lance mon programme et la houppe ce c’est qwerty qui nous est retourné alors pourquoi parce que là on vient de se faire piéger effectivement le fait qu’on ait défini un template fait que ce truc là peut marcher avec potentiellement une infinité de type très bien mais la question c’est que fait l’opérateur inférieur pour le type considérer la nous avons quoi nous avons des pointeurs 1 donc ce qu’il faut comprendre c’est que là on cherche pas calculer la chaîne la plus petite des deux dans l’ordre du dictionnaire c’est pas ça qu’on cherche à faire du tout là ce qu’on cherche à calculer c’est le pointeur le plus petit en mémoire celui qui pointe le plus bas en mémoire d’accord il faut comprendre c’est que du coup quand je permute mais deux variables tantôt il y en a un qui avant tantôt c’est l’autre et donc du coup je change l’ordre de stockage en mémoire de mes deux variables et donc fatalement lui ni me renvoie des résultats différents là on s’est fait piéger tout simplement parce qu’on n’avait pas forcément pris fait attention sur le fait que la le template est invoqué sur des pointeurs et que inférieur et déjà existant au niveau des pointeurs et calcule bien l’adresse la plus basse en mémoire comment nous dépatouiller de ce cas là il ya une solution regardez ici ce que je vais faire c’est que je vais déclarer alors en inline le fait que je le mette en inline ce n’est pas une obligation je vais définir une fonction in line pour simplement ne pas avoir de cpp a rajouté bon pourquoi pas je vais donc qu des quelque chose qui va me renvoyer un constat chars étoiles qui va s’appeler min et qui va prendre un constat chars étoiles est sain et un conte ce char étoile s 2 très bien donc nous avons ici une fonction inline mais cette fois ci c’est plus un template 1 c’est une fonction cette fonction va s’appliquer très précisément à des données de type choquant ce char étoiles ce qu’il faut comprendre c’est que c’est tout à fait autorisé vous pouvez à la fois avoir un template et en même temps avoir une fonction qui ont le même nom ce qu’il faut savoir c’est que le compilateur la première des choses qui va se poser comme question quand il va voir ça c’est existe-t-il une fonction qui s’appellent mimi qui travaillent sur des constats chars étoiles dans notre cas là maintenant ça va être oui donc c’est la fonction qui va être prise par des veaux si jamais nous n’avions pas eu de fonctions spécifiques à des constats chars étoiles dans ce cas là le compilateur se serait dit y aurait-il un template qui s’appellent mimi qui pourraient match et avec nos constats chars étoiles et donc on peut définir les deux en même temps mais si vous définissez une fonction c’est forcément la fonction qui va prévaloir sur le template je vais finaliser cette fonction diaz include alors pour rappel quand on inclut une librairie c il est convenu depuis ces puces +98 de prêts fixé le nom de la librairie par c est de remettre son nom d’origine d’accord donc ans et moi ce que je voulais inclure ses strings point h donc string point h devient ses strings d’accord donc pour rappel on aurait fait comme ça si on avait été lancée on aurait inclus string pointe très bien pourquoi j’inclus sabah parce que ici j’ai une fonction de comparaison de chars étoiles elle s’appelle str cmp est donc ici je vais faire prier turn et donc si esther cmp de s 1,16 2 alors pour rappel str cmp peut renvoyer trois types de valeurs trois ensemble de valeurs soit j’ai des valeurs négatives dans ce cas la s1 est inférieur s2 soit il renvoie une valeur nulle dans ce cas là les deux sont égales soit il renvoie une valeur positive et dans ce cas la s1 et supérieur s ii donc ici ce que je vais tester c’est si je suis effectivement inférieures à zéro si c’est le cas je renvoie s1 sinon je renvoie s2 donc j’ai bien un template qui s’applique dans la majorité des cas mais par contre pour le cas spécifique des constateurs étoiles je veux que ce soit cette fonction in line qui soient appliquées je reviens dans mon programme il semblerait que tout est bien compilé je lance le programme est donc il semblerait bien que azerty soit la chaîne la plus petite je perds but mais variable pour tester dans l’autre sens pour être sûr qu’on ait pas de piège et donc effectivement c’est bien azerty kim est renvoyé dans les deux cas bon ben voilà qui clôt l’ensemble des informations que je voulais vous donner sur cette notion de fonctions online a alors à savoir on n’en a pas fini avec ses fonctions dans des prochains tuto nous serons encore obligé de définir un certain nombre de fonctions inline on y reviendra noter aussi qu’on peut aussi définir des opérateurs globaux inline ça revient au même que ce soit une fonction d’opérateur global c’est exactement le même principe est donc vous pouvez les rendre template excusez-moi beinheim et emplettes donc nous reviendrons sur ces notions de fonctions template et puis en tout cas dans le prochain tuto nous allons nous intéresser à la notion de classe template effectivement verra il est possible de définir des classes pour lesquelles nous allons nous abstraire sur les types de données que nous allons pouvoir utiliser sur les attributs ou les méthodes de cette classe bon eh bien je vous remercie de votre attention et puis je vous dis à très vite pour le prochain tuto