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