Member-Functions in Standard-Algorithms



  • Hallo Forum,

    ich habe ein wenig Schwierigkeiten mit std::bind und std::mem_fn in Algorithmen aus <algorithm>.
    Zunächst ein kleines konstruiertes Beispiel:

    #include <algorithm>
    #include <functional>
    #include <vector>
    
    using namespace std::placeholders;
    
    struct MyInt
    {
        MyInt (int val) : m_val(val) {}
        bool IsEqual(int val) const { return m_val == val; }
    
        int m_val;
    };
    
    bool AreEqual(const MyInt& lhs, const MyInt& rhs)
    {
        return lhs.m_val == rhs.m_val;
    }
    
    int main()
    {
        std::vector<MyInt> ints{ 2, 3, 4 };
    
        MyInt compval(3);
    
        auto it1 = std::find_if(ints.begin(), ints.end(), std::bind(AreEqual, _1, compval));
        //auto it2 = std::find_if(ints.begin(), ints.end(), std::bind(std::mem_fn(&MyInt::IsEqual), _1, compval));
        //auto it2 = std::find_if(ints.begin(), ints.end(), std::bind(&MyInt::IsEqual, _1, compval));
    
        return 0;
    }
    

    Konkret geht es mir darum, dass ich gerne MyInt::IsEqual mit std::find_if auf dem vector "ints" verwenden würde.
    Ich denke, ich verstehe prinzipiell wie std::bind funktioniert (deshalb das Beispiel mit der freien Funktion AreEqual. Und ich denke auch, dass ich verstanden habe, was std::mem_fn tut, wobei ich mir nicht hundertprozentig sicher bin, ob ich für diesen Fall überhaupt beide benötige.
    Die beiden auskommentierten Zeilen waren zwei Versuche, führen aber jeweils zu Compiler-Fehlern, die für mich leider schwer lesbar sind.

    Mir ist klar, dass ich das beispielsweise relativ simpel mit einem Lambda lösen könnte, ich wüsste aber dennoch gerne wie es auf diesem Weg funktioniert.
    Kann mir jemand auf die Sprünge helfen?



  • Oje, hat sich erledigt 🤦♂

    MyInt::IsEqual sollte natürlich eigentlich anders aussehen:

        bool IsEqual(const MyInt& val) const { return m_val == val.m_val; }
    

    Dann funktionieren beide auskommentierten Varianten.



  • auto it4 = std::find_if(ints.begin(), ints.end(), [compval](MyInt x){ return compval.IsEqual(x); });
    auto it5 = std::find_if(ints.begin(), ints.end(), std::bind_front(&MyInt::IsEqual, compval));
    

Log in to reply