Notre page Facebook | |
Notre groupe Facebook |
|_Accueil Langage C++
|_Définition de templates
|_Fonction template
|_Classe template
|_Utilisation du mot clé typename
|_Spécialisation de templates
|_Utilisation de types traits
|_Les nouveautés C++ 2011
Avec le nouveau C++ ISO 2011, des évolutions font leur apparition pour la définition des templates. Voici un petit résumé de ces nouveautés.
Anciennement, si vous définissiez un type template à partir d'un autre type template, vous deviez faire attention à ne pas produire deux caractères >
consécutivement, sinon le compilateur ne comprenait pas ce que faisait l'opérateur >>
dans la définition du type. Deux solutions était
possibles pour régler ce problème : ajouter un espace ou utiliser un typedef.
1 2 3 4 5 6 7 8 9 10 11 |
#include <vector> // Solution 1 std::vector< std::vector<int> > matrix; // ^ white space is mandatory before C++ ISO 2011 // Solution 2 typedef std::vector<int> int_vector; std::vector<int_vector> matrix2; |
Il est maintenant possible de ne plus se soucier de ce point de détail et de coller vos deux caractères >
. C'est plus simple.
1 2 3 4 5 |
#include <vector> std::vector<std::vector<int>> matrix; // ^ no white space is required with C++ ISO 2011 |
Il vous est maintenant possible de définir des fonctions génériques (templates) avec un nombre variable de types génériques.
1 2 3 4 |
template <typename T, typename ... ARGS> void method( const T & parameter, const ARGS & ... args ) { // TODO } |
En fait, il est nécessaire de mettre en oeuvre de la spécialisation de template pour coder un template variadique. Voici un exemple qui permet d'afficher un nombre quelconque de paramètres (chacun d'eux pouvant avoir un type spécifique).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> #include <string> using namespace std; template <typename T> void display( const T & parameter ) { cout << parameter << endl; } template <typename T, typename ... ARGS> void display( const T & parameter, const ARGS & ... args ) { cout << parameter << " "; display( args... ); } int main() { display( "Hello", 1, string("value"), 4.3 ); return 0; } |
Après résolution par le compilateur, quatre fonctions auront été générées par cet exemple. La spécialisation à nombre variable de paramètre ayant produit les surcharges suivante :
void display( const char *, int, string, double )
, void display( const int &, string, double ) et void display( const string &, double ). L'autre spécialisation produit une seul surcharge :
void display( const double & )
. Pour compiler et exécuter votre programme, veuillez procéder ainsi :
$> g++ -std=c++11 -o Essai Essai.cpp $> Essai Hello 1 value 4.3 $>
1 |
extern template class std::vector<MyType>; |
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :