2009-06-15 21 views
15

Betrachten Sie folgendes Beispiel.boost :: bind und Klassenmitgliedsfunktion

#include <iostream> 
#include <algorithm> 
#include <vector> 

#include <boost/bind.hpp> 

void 
func(int e, int x) { 
    std::cerr << "x is " << x << std::endl; 
    std::cerr << "e is " << e << std::endl; 
} 

struct foo { 
    std::vector<int> v; 

    void calc(int x) { 
     std::for_each(v.begin(), v.end(), 
      boost::bind(func, _1, x)); 
    } 

    void func2(int e, int x) { 
     std::cerr << "x is " << x << std::endl; 
     std::cerr << "e is " << e << std::endl; 
    } 

}; 

int 
main() 
{ 
    foo f; 

    f.v.push_back(1); 
    f.v.push_back(2); 
    f.v.push_back(3); 
    f.v.push_back(4); 

    f.calc(1); 

    return 0; 
} 

alles funktioniert gut, wenn ich func() Funktion verwenden. Aber in der realen Anwendung muss ich die Klassengliedfunktion verwenden, d. H. foo::func2() in diesem Beispiel. Wie kann ich das mit boost :: bind machen?

Antwort

18

Sie waren wirklich sehr, sehr nah:

void calc(int x) { 
    std::for_each(v.begin(), v.end(), 
     boost::bind(&foo::func2, this, _1, x)); 
} 

EDIT: oops, so war I. heh.

Obwohl, nach Rücksprache, ist nichts wirklich falsch mit Ihrem ersten Arbeitsbeispiel. Sie sollten möglichst freie Funktionen gegenüber Member-Funktionen bevorzugen - Sie können die erhöhte Einfachheit in Ihrer Version sehen.

+0

ist Dies soll mit boost :: lamba :: bind funktionieren. Ich habe boost :: bind nicht viel benutzt. –

1

Bei der Verwendung von boost :: bind für Memberfunktionen der Bindungsklasse muss das zweite Argument den Objektkontext angeben. Ihr Code wird also funktionieren, wenn das zweite Argument this

Verwandte Themen