Member-Funktionsaufruf mit boost bind
-
Hallo,
ich würde gerne etwas in boost bind einarbeiten.
Dazu möchte ich für alle Elemente in einem Vektor eine bestimmte Member-Funktion aufrufen. Dazu möchte ich eine Kombination aus for_each und bind haben.Ich verdeutliche es mal so:
std::for_each(myList.begin(), myList.end(), myListEntry.foo());Also die Klasse in meiner Liste hat eine Member-Funktion foo();
Allerdings weiß ich nicht wie ich von bar(Foo*) zu foo->foo() komme.
Genau dafür suche ich nach einer Lösung Mithilfe von boost.Vielen Dank für eure Hilfe!
-
std::for_each(myList.begin(), myList.end(), boost::bind(&TypeOfMyListEntry::foo, &myListEntry, _1));
-
Tachyon schrieb:
std::for_each(myList.begin(), myList.end(), boost::bind(&TypeOfMyListEntry::foo, &myListEntry, _1));Danke dir, aber du hast mich vermutlich falsch verstanden.
myListEntry soll jeweils der Eintrag sein über den gerade iteriert wird.So ruft man doch eine Member-Funktion mit einem Parameter auf immer dem gleichen Objekt auf, oder?
-
boost-Neuling schrieb:
std::for_each(myList.begin(), myList.end(), myListEntry.foo());for_each(myList.begin(), myList.end(), bind(&DeineKlasse::foo,_1) );(ungetestet)
könnte man glaub'ich auch mit boost::mem_fn machen, weil ja nicht wirklich irgend etwas gebunden wird:
for_each(myList.begin(), myList.end(), mem_fn(&DeineKlasse::foo) );(ungetestet)
in reinem Standard C++ (ohne Boost) müsste auch das hier gehen:
for_each(myList.begin(), myList.end(), std::mem_fun_ref(&DeineKlasse::foo) );(ungetestet)
siehe Boost/StdLib Doku
-
krümelkacker schrieb:
for_each(myList.begin(), myList.end(), bind(&DeineKlasse::foo,_1) );Danke!
Perfekt!

#include <iostream> #include <vector> #include <algorithm> #include <boost/bind/bind.hpp> class Foo{ public: void foo(){ std::cout << "foo()" << std::endl; } }; int main(){ std::vector<Foo*> vector; vector.push_back(new Foo()); vector.push_back(new Foo()); std::for_each(vector.begin(), vector.end(), boost::bind(&Foo::foo, _1)); }foo()
foo()
-
krümelkacker schrieb:
for_each(myList.begin(), myList.end(), mem_fn(&DeineKlasse::foo) );Funktioniert ebenfalls!
for_each(myList.begin(), myList.end(), std::mem_fun_ref(&DeineKlasse::foo) );Funktioniert falls keine Zeiger im Vektor sind, sonst std::mem_fun

-
Welche der Varianten bevorzugt ihr denn?
-
boost-Neuling schrieb:
Welche der Varianten bevorzugt ihr denn?
Da Du boost benutzt:
BOOST_FOREACH(DeineKlasse & obj, myList) { obj.foo(); }
-
Ich benutze bind (in Verbindung mit Elementfunktionen) oder mem_fn, mem_fun, mem_fun_ref so gut wie gar nicht. Ich weiß spontan auch nicht, was mem_fn jetzt besser macht gegenüber bind. Per bind kann man eben zusätzlich noch einige Parameter "dranbinden", ist also in der Hinsicht flexibler als mem_fn. Die alten mem_fun/mem_fun_ref Funktionen sind weniger zu gebrauchen, weil sie mit Referenzparameter nicht ganz klarkommen (soweit ich weiß) und auch keine schlauen Zeiger zulassen. Die Boost-Varianten funktionieren nämlich auch, wenn Dein Vector zB shared_ptr<DeineKlasse>-Objekte speichert.
-
Ich glaube ich bevorzuge GCC 4.6 mit C++0x und Range-based for

-
boost-Neuling schrieb:
Ich glaube ich bevorzuge GCC 4.6 mit C++0x und Range-based for

Meine Rede. Wäre der GCC für Mac nur verfügbar.
-
314159265358979 schrieb:
boost-Neuling schrieb:
Ich glaube ich bevorzuge GCC 4.6 mit C++0x und Range-based for

Meine Rede. Wäre der GCC für Mac nur verfügbar.
Also ich verwende GCC (4.6) für den MacEinfach MacPorts installieren:
http://www.macports.org/sudo port install gcc46Fertig

Gruß,
XSpille
-
Ich werde es versuchen, wenn das funktionieren sollte, heirate ich dich!
-
Ich bekomme es einfach nicht hin, finde den richtigen Compilerpfad nicht.