2009-04-22 9 views
3

J'essaie d'utiliser std :: for_each pour sortir le contenu des vecteurs, qui peuvent contenir différents types. J'ai donc écrit une fonction de sortie générique comme ceci:En C++ comment puis-je utiliser une fonction template comme troisième paramètre dans std :: for_each?

template<typename T> void output(const T& val) 
{ 
    cout << val << endl; 
} 

que je voudrais utiliser avec: dans la déclaration for_each

std::for_each(vec_out.begin(), vec_out.end(), output); 

mais le compilateur se plaint de « ne pouvait pas déduire un argument de modèle ». Se plaint également avec "Un modèle de fonction ne peut pas être un argument à un autre modèle de fonction".

N'est-ce pas possible? J'aurais pensé que le compilateur connaîtrait le type de vec_out (son vecteur) et devrait donc instancier la fonction "output (const double & val)"?

Si cela ne fonctionne pas, comment puis-je obtenir une fonctionnalité STL similaire sans écrire de boucles manuelles?

Je suis tout à fait nouveau pour C++ et encore apprendre les ficelles du métier :-)

+0

désolé, vec_out est de type vector, pas de vecteur. – PowerApp101

+0

A la fois dirkgently et Naveen fourni la bonne réponse, que je comprends maintenant ... merci! – PowerApp101

+0

Marquer les réponses comme acceptées afin que les lecteurs plus tard savent (de la liste de la page principale) –

Répondre

9

Essayez:

std::for_each(vec_out.begin(), vec_out.end(), output<T>); 

vec_out est un conteneur (vector) de type T.

Note: L'algorithme for_each attend un foncteur unaire pour son dernier argument. Voir le lien pour un exemple utilisant des foncteurs.

+0

Merci, j'étais oublieux et en laissant de côté le bit . Doh! – PowerApp101

7

Vous devez passer une instanciation du modèle. Quelque chose comme output<int> si votre vecteur est vecteur d'entiers.

Par exemple:

template<typename T> void output(const T& val) 
{ 
    cout << val << endl; 
} 



void main(int argc,char *argv[]) 
{ 
    std::vector<int> vec_out; 
    std::for_each(vec_out.begin(), vec_out.end(), output<int>); 
} 
+0

Génial, cela fonctionne parfaitement. Je me sens un peu stupide. – PowerApp101

+2

'void' n'est pas un type de retour valide pour main. – dirkgently

7

Je voudrais simplement ajouter aux réponses correctes: le compilateur peut déduire le type si vous enveloppez votre fonction de modèle dans un objet de fonction (alias foncteur):

struct OutputFunctor 
{ 
    template <typename T> 
    void operator()(const T& val) const { output(val); } 
}; 

void test() 
{ 
    std::vector<int> ints; 
    std::vector<float> floats; 

    std::for_each(ints.begin(), ints.end(), OutputFunctor()); 
    std::for_each(floats.begin(), floats.end(), OutputFunctor()); 
} 
+0

J'aime ça aussi! Merci! – PowerApp101

+0

Cela fonctionne également lorsque vous appelez à partir d'une autre fonction basée sur un modèle. Merci! – Marc