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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include <iostream>
/* ceci est la fonction qui s'occupe de traiter
* les paramètres fixes
*/
void base(const char * a, const char * b, int i){
std::cout<<"base called with\n"
<<"a = "<<a<<"\n"
<<"b = "<<b<<"\n"
<<"i = "<<i<<"\n";
}
/* juste une déclaration de la fonction destinée
* à traiter les paramètres dont on ne sait rien
* Elle part cependant du principe qu'il y aura forcément
* au moins un paramètre dont on ignore tout
*/
template <typename T,typename ... ARGS>
void details(T first, ARGS ... args);
/* la version "terminale" de cette fonction:
* elle s'occupe de traiter un paramètre
* "dont on ignore tout" et s'arrête après cela
*/
template <typename T>
void details(T first){
std::cout<<"detailsfinal call with T="<<first<<"\n";
}
/* la version récursive de la fonction:
* elle fait appel à la version finale pour le premier
* paramètre, puis provoque la récursivité pour
* le nombre inconnu de paramètres dont on ne sait rien
*/
template <typename T,typename ... ARGS>
void details(T first, ARGS ... args){
std::cout<<"recursive call\n";
otherDetails(first);
otherDetails(args ...);
}
/* ceci est la fonction que l'on appelle réellement
* avec trois paramètres fixes et
* "un nombre inconnu de paramètres dont on ne sait rien
*/
template <typename ... ARGS>
void foo(const char * a, const char * b, int i, ARGS ... args){
/* elle fait appel à la fonction qui s'occupe de traiter
* les paramètres fixes
*/
base(a, b, i);
/* suivi d'un appel à la fonction destinée à
* traiter les paramètres dont on ne sait rien
*/
details(args ...);
}
/* l'utilisation de tout cela ressemblerait à quelque chose
* comme
*/
int main(){
foo("salut","le monde", 3, 3.1415926,"truc",15);
return 0;
} |
Partager