User Tools

Site Tools


cpp:syntax:functions:generic

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
cpp:syntax:functions:generic [2021/04/06 13:26]
bmonsuez
cpp:syntax:functions:generic [2022/11/18 10:47] (current)
Line 166: Line 166:
 En effet, la fonction spécialisée est considérée comme prioritaire sur la fonction non spécialisée. Et c'est ainsi que nous allons exécuter le code qui ne compare plus les pointeurs mais bien les chaînes de caractères en appelant la fonction [[https://​en.cppreference.com/​w/​c/​string/​byte/​strcmp|''​strcmp''​]] qui effectue cette comparaison. En effet, la fonction spécialisée est considérée comme prioritaire sur la fonction non spécialisée. Et c'est ainsi que nous allons exécuter le code qui ne compare plus les pointeurs mais bien les chaînes de caractères en appelant la fonction [[https://​en.cppreference.com/​w/​c/​string/​byte/​strcmp|''​strcmp''​]] qui effectue cette comparaison.
  
 +==== Fonctions partiellement spécialisées ====
 +
 +Dans l'​exemple précédent,​ nous avions une fonction complétement spécialisée,​ l'​ensemble des paramètres de type était défini. Nous pouvons définir des spécialisations partielles de fonctions. ​
 +
 +Considérons le cas d'une fonction ''​is_pointer''​ qui doit retourner ''​true''​ si l'​argument passé en paramètre est un pointeur et ''​false''​ dans tous les autres cas.
 +
 +Le comportement par défaut de la fonction est de retourner ''​false''​.
 +
 +<code cpp>
 +template<​class T>
 +bool is_pointer(T anItem) { return false; }
 +</​code>​
 +
 +Si l'​argument est de type pointeur, alors la fonction doit retournée ''​true''​. Nous pouvons introduire les deux spécialisations suivantes :
 +
 +<code cpp>
 +template<​class T>
 +bool is_pointer(const T* anItem) { return true; }
 +template<​class T>
 +bool is_pointer(T* anItem) { return true; }
 +</​code>​
 +
 +
 +Donc maintenant, que va-t-il se passer. Quand on va appeller la fonction avec un objet ayant un certain type, le compilateur va regarder si le type de l'​argument est de type ''​T*''​ ou ''​const T*''​ et dans ce cas, il va appeller l'une des deux fonctions :
 +<code cpp>
 +template<​class T>
 +bool is_pointer(const T* anItem) { return true; }
 +template<​class T>
 +bool is_pointer(T* anItem) { return true; }
 +</​code>​
 +et retournera le résultat ''​true''​. Sinon, il appellera la fonction générique non spécialisée et il retournera le résultat ''​false''​.
 +
 +Au passage, ce calcul s'​effectue uniquement à la compilation. C'est d'​ailleurs pour cela que C++ a introduit avec la version 2020 l'​annotation [[https://​en.cppreference.com/​w/​cpp/​language/​consteval|''​consteval''​]] pour indiquer que le résultat de la fonction est calculable à la compilation et qu'il n'est pas besoin de générer de code pour l'​exécution. On retrouve ici l'​objectif de performance de C++. En C++ 20, nous écrirons :
 +
 +<code cpp>
 +template<​class T>
 +consteval bool is_pointer(T anItem) { return false; }
 +template<​class T>
 +consteval bool is_pointer(const T* anItem) { return true; }
 +template<​class T>
 +consteval bool is_pointer(T* anItem) { return true; }
 +</​code>​
  
 ===== Pour aller plus loin ===== ===== Pour aller plus loin =====
  
 [[https://​en.cppreference.com/​w/​cpp/​language/​function_template|Template functions]] [[https://​en.cppreference.com/​w/​cpp/​language/​function_template|Template functions]]
 +
 +[[https://​en.cppreference.com/​w/​cpp/​language/​template_parameters|Template parameters and template arguments]]
  
 [[https://​en.cppreference.com/​w/​cpp/​language/​template_argument_deduction|Template argument deduction]] [[https://​en.cppreference.com/​w/​cpp/​language/​template_argument_deduction|Template argument deduction]]
cpp/syntax/functions/generic.1617715574.txt.gz · Last modified: 2021/04/06 13:26 by bmonsuez