Problem mit std::for_each und boost::shared_ptr
-
Hallo an Alle
Ich habe ein Problem mit dem Aufruf von std::foreach im Zusammenhang mit shared_ptr.
class bar{}; class foo { void do(bar& b); }; typedef boost::shared_ptr<foo> foo_ptr; void func(bar& b) { std::vector<foo_ptr> foos; //gefüllt //Für jedes Element foo::do aufrufen und b übergeben. std::for_each(foos.begin(), foos.end(), ???); }Wenn ich mit boost::bind oder std::mem_fun1_t arbeite bekomme ich immer die Fehlermeldung, dass boost::shared_ptr<foo> keinen Member namens "do" hat. Mir ist auch schon klar, warum die Meldung kommt, jedoch weiß ich nicht, wie ich es umgehen soll. Im Aufruf von foreach müsste der share_ptr dereferenziert werden und dann kann die Methode aufgerufen werden.
Hat jemand ne Ahnung wie ich das anstellen kann?
Grüße
Timo
-
Im Zweifel in etwa so, wobei ich mir nicht vorstellen kann dass sich dafür nicht schon jemand was einfacheres gebastelt hat.
bind( &foo::do, bind( &shared_ptr< foo >::get, _1 ), ref( b ) )
-
LordJaxom schrieb:
Im Zweifel in etwa so, wobei ich mir nicht vorstellen kann dass sich dafür nicht schon jemand was einfacheres gebastelt hat.
bind( &foo::do, bind( &shared_ptr< foo >::get, _1 ), ref( b ) )Also da es funktioniert, finde ich es einfach genug und ärgere mich grade, dass ich da net selber drauf gekommen bin

Vielen Dank
-
horscht2999 schrieb:
LordJaxom schrieb:
Im Zweifel in etwa so, wobei ich mir nicht vorstellen kann dass sich dafür nicht schon jemand was einfacheres gebastelt hat.
bind( &foo::do, bind( &shared_ptr< foo >::get, _1 ), ref( b ) )Also da es funktioniert, ...
ja - aber notwendig war das nur in den ersten Versionen mit boost.bind. Wenn Du eine aktuelle Version von boost verwendest, sollte das einfachere
bind( &foo::do, _1, ref( b ) )auch funktionieren (nenne keine Methode 'do').
Siehe dazu die get_pointer-Konstruktion für Smart-Pointer in Kombination mit bind & mem_fn.
Gruß
Werner
-
Werner Salomon schrieb:
ja - aber notwendig war das nur in den ersten Versionen mit boost.bind. Wenn Du eine aktuelle Version von boost verwendest, sollte das einfachere
bind( &foo::do, _1, ref( b ) )auch funktionieren (nenne keine Methode 'do').
Siehe dazu die get_pointer-Konstruktion für Smart-Pointer in Kombination mit bind & mem_fn.
Gruß
WernerJap hat funktioniert. Komischerweise hatte ich das so auch probiert, aber bekam die oben erwähnte Fehlermeldung. Eventuell hatt ich aber nicht bind verwendet sondern mem_fn.
Naja jetzt gehts und ich bin etwas schlauer geworden:-) Vielen Dank!!!
Grüße
TimoPS: natürlich nenne ich auch keine Methode "do":-) War nur ein schnell gehacktes Beispiel:-)