Member-Functions in Standard-Algorithms
-
Hallo Forum,
ich habe ein wenig Schwierigkeiten mit
std::bind
undstd::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
mitstd::find_if
auf dem vector "ints" verwenden würde.
Ich denke, ich verstehe prinzipiell wiestd::bind
funktioniert (deshalb das Beispiel mit der freien FunktionAreEqual
. Und ich denke auch, dass ich verstanden habe, wasstd::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));