Richtiger Binder fuer Memberfunktion die *this als Argument braucht, geht nicht
-
Hallo,
ich versuche gerade for_each zu verwenden und habe Probleme den richtigen Binder zu finden..#include <vector> #include <iostream> #include <algorithm> #include <functional> using namespace std; class Visitor; struct Element { void accept(Visitor&); }; struct Visitor { void visit(Element& e) { cout << "Element visited!\n"; } void visitAll(vector< Element* > vec) { /* vector< Element* >& elements = vec; for( vector< Element* >::iterator iter = elements.begin() ; iter != elements.end() ; ++iter){ (*iter)->accept(*this); } //*/ // Problem: das obere (funktioniert) haette ich gerne per for_each() mit binder // folgender Ansatz klappt jedoch leider nicht.. for_each(vec.begin(), vec.end(), mem_fun1_ref_t< void, Element*, Visitor >(&Element::accept, this)); // bind2nd()??!!! } }; void Element::accept(Visitor& v) { v.visit(*this); } int main() { cout << "init..\n"; vector< Element* > vec; Element elem1, elem2, elem3; vec.push_back(&elem1); vec.push_back(&elem2); vec.push_back(&elem3); Visitor visitor; visitor.visitAll(vec); cout << "READY.\n"; return 0; }Danke im voraus.

-
Falls Du schon den TR1 benutzt:
using std::tr1::placeholders::_1; std::for_each(vec.begin(), vec.end(), std::tr1::bind(&Element::accept, _1, *this));Simon
-
Hallo, ich habe vergessen zu sagen, dass ich gerne eine Loesung haette die ohne Boost auskommt (binder waere ansonsten meine erste Wahl gewesen), somit verwende ich auch keine Placeholder (leider - sind die schon im Standard?? Bei mir kompiliert der Code so ohne Boost Einbindung auch nicht).
Ich wollte eben wissen, wie man das per bind1st(), bind2nd() oder mem_fun_ptr/ref/_t() realisieren koennte.

-
Hier noch die Lsg ohne TR1 impl. (das ist nicht Boost, sondern eben die TR1 impl.). Noch kein definitiver Standard also, sind bei MS Visual Studio 2008 ab SP1 dabei (ev. bei 2005 SPx auch).
Dazu musst Du dein Element anpassen. Das Problem liegt im Template, welches sonst versucht eine Ref. einer Ref. zu bilden, was nicht geht.
struct Element { void accept(Visitor*); };std::for_each(vec.begin(), vec.end(), std::bind2nd(std::mem_fun(&Element::accept), this));Simon
-
theta schrieb:
Noch kein definitiver Standard also, sind bei MS Visual Studio 2008 ab SP1 dabei (ev. bei 2005 SPx auch).
Doch, TR1 ist definitiver Standard. Nur eben optional und damit nicht verpflichtend, um seinen Compiler "C++98 konform" nennen zu dürfen (aber welcher Compiler ist das schon).
-
Danke, der Ansantz mit bind2nd funktioniert perfekt. Jetzt weiss ich auch warum meine bind2nd Versuche immer gescheitert sind..