Template de fonction en argument d'un template de fonction
Bonjour !
J'ai un code similaire à ceci :
Code:
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
|
/*
main.cpp
*/
#include <iostream>
#include <vector>
template<typename T, typename F>
void FairePourTous (const std::vector<T>& vec, F f)
{
std::vector<T>::const_iterator it;
for (it=vec.begin(); it!=vec.end(); it++)
f (*it);
}
void Afficher (int x)
{
std::cout << x << "\n";
}
int main (int argc, char **argv)
{
std::vector<int> monvector;
monvector.push_back (1);
monvector.push_back (2);
monvector.push_back (3);
FairePourTous (monvector, Afficher);
return 0;
} |
qui fonctionne très bien.
Cependant, j'aimerais faire une version template de "Afficher", tout simplement parce que je ne peux pas savoir à l'avance ce que va contenir mon vecteur.
D'instinct, je modifie donc mon code pour qu'il ressemble à qqchose comme ça :
Code:
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
|
/*
main.cpp
*/
#include <iostream>
#include <vector>
template<typename T, typename F>
void FairePourTous (const std::vector<T>& vec, F f)
{
std::vector<T>::const_iterator it;
for (it=vec.begin(); it!=vec.end(); it++)
f (*it);
}
template<typename T>
void Afficher (T x)
{
std::cout << x << "\n";
}
int main (int argc, char **argv)
{
std::vector<int> monvector;
monvector.push_back (1);
monvector.push_back (2);
monvector.push_back (3);
FairePourTous (monvector, Afficher);
return 0;
} |
Et là, je me fais gronder par mon compilateur (VS2010), qui me signale qu'on ne peut pas passer un template de fonction en paramètre à un template de fonction :
Citation:
error C2896: 'void FairePourTous(const std::vector<T> &,F)' : cannot use function template 'void Afficher(T)' as a function argument
Au sujet de cette erreur, la doc en ligne du compilateur est aussi intéressante à lire que l'annuaire, parce qu'elle dit juste comment reproduire le problème (youpi!).
J'ai remarqué que si je précise, à l'appel de FairePourTous, que je veux une version int de Afficher (Afficher<int>) ça marche. Mais j'aimerais trouver une façon plus automatique de faire ça, parce que dans le contexte original, mon template prend qqchose comme 3 ou 4 arguments, et je ne VEUX pas les préciser à chaque fois.
Des suggestions ?
merci d'avance !!!
Edit : je tiens à préciser que j'ai essayé ceci, qui me parait pourtant suffire à expliquer mes intentions à mon despotique compilateur :
Code:
1 2 3 4 5 6 7 8
|
template<typename T, typename F>
void FairePourTous (const std::vector<T>& vec, F f)
{
std::vector<T>::const_iterator it;
for (it=vec.begin(); it!=vec.end(); it++)
f<T> (*it);
} |