2009-11-05 7 views

Répondre

4

Lorsque vous utilisez std :: mem_fun, vous devez passer le pointeur à la classe comme premier argument. Vous pouvez le lier dans ce cas avec std :: bind1st.

class A 
{ 
public: 
    void print(int v) {std::cout << v;} 

    void load() 
    { 
     std::vector<int> vt(10, 20); 

     std::for_each(vt.begin(), vt.end(), std::bind1st(std::mem_fun(&A::print), this)); 
    } 
} 
+0

Le problème est, mem_fun serait d'appliquer sur un cas, mais vt 'contient int's comme l'a par AraK. –

+0

@Matthieu: Non, 'mem_fun' transforme la méthode en un foncteur binaire. bind1st prend un foncteur binaire et le transforme en un foncteur unaire. Dans ce cas, les arguments 'mem_fun' sont' A * 'et' int'; liant 'this' comme le premier argument laisse un foncteur unaire prenant un' int' comme prévu. – MSalters

4

Qu'est-ce que vous avez dans vt sont des nombres entiers non des objets de type A. En outre, print ne manipule pas des variables membres, juste faire static:

class A{ 

void load() 
{ 
vector<int> vt(10,20); 
std::for_each(vt.begin(), vt.end(), A::print); // static functions are regular functions 
} 

static void print(int a) 
{ 
cout<<a; 
} 

}; 
3

Je trouve boost :: bind utile. De cette façon, je n'ai pas à me souvenir de toutes les règles associées à std :: mem_fun.

#include <boost/bind.hpp> 
class A{ 

void load() 
{ 
    vector<int> vt(10,20); 
    std::for_each(vt.begin(), vt.end(), boost::bind(&A::print,this,_1)); 
} 

void print(int a) 
{ 
    cout<<a; 
} 
}; 

Bien que dans ce cas particulier, je préfère la copie à ostream_iterator idiome:

copy(vt.begin(), vt.end(), ostream_iterator<int>(cout, " ")); 
Questions connexes