Member-Funktionsaufruf mit boost bind



  • 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 Mac

    Einfach MacPorts installieren:
    http://www.macports.org/

    sudo port install gcc46
    

    Fertig 👍

    Gruß,
    XSpille



  • Ich werde es versuchen, wenn das funktionieren sollte, heirate ich dich!



  • Ich bekomme es einfach nicht hin, finde den richtigen Compilerpfad nicht.


Anmelden zum Antworten