2010-11-17 44 views
3

Bonjour à tous, je voudrais appeler une fonction membre (qui attend une référence) pour chaque objet de (disons) un vecteur membre de la même classe, comme le code suivant montre:Appeler une fonction membre avec des données membres en utilisant for_each

#include <functional> 
#include <algorithm> 
#include <vector> 
#include <iostream> 
using namespace std; 

struct Stuff { 
    double x; 
}; 

class Test { 
public: 
    void f1(Stuff & thing); 
    void f2(void); 
    vector<Stuff> things; 
}; 

void Test::f1(Stuff & thing) { 
    ; // do nothing 
} 

void Test::f2(void) { 
    for_each(things.begin(), things.end(), f1); 
} 

int main(void) 
{ 

    return 0; 
} 

Ce code me donne une erreur du compilateur lié à type de fonction non résolue surcharge. J'ai essayé aussi avec bind, mais il semble que les références requises dans f1 sont un problème. Je sais qu'il me manque quelque chose d'important ici, alors j'en profite pour résoudre mon problème et apprendre. Pour le moment, je ne peux pas installer boost, mais je voudrais savoir si boost est utile pour résoudre ce problème. Merci d'avance.

Répondre

4
  • La fonction que vous voulez appeler ne peut pas être simplement identifiés par f1 mais devrait être nommé &Test::f1 (comme dans: fonction membre f1 de classe Test)
  • Fonction f1 ne prend pas un seul argument: comme tout Enfin, une liaison standard ne sera pas capable de faire l'affaire car elle ne gère pas les paramètres passés par référence. Elle est implicite. this Paramètre de type Test * const

Boost.Bind serait en effet une excellente option:

std::for_each(things.begin(), things.end(), boost::bind(&Test::f1, this, _1)); 
+0

Merci. Très clair. – iluvatar

+0

Je voulais juste ajouter que vous pouvez aussi utiliser 'std :: bind' (qui est identique à Boost.Bind) de C++ 11:' std :: for_each (things.begin(), things.end(), std: : bind (& Test :: f1, this, std :: placeholders :: _ 1)); ' – congusbongus