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ß
    Werner

    Jap 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
    Timo

    PS: natürlich nenne ich auch keine Methode "do":-) War nur ein schnell gehacktes Beispiel:-)


Anmelden zum Antworten