Seite 1 von 1
Lambda Funktionen die Memberfunktionen rufen
Verfasst: Di Jan 03, 2012 8:04 am
von Bebu
Hallo,
ich habe mal eine Frage an die Lambda Experten. Wie bekomme ich folgenden Code als Lambda Funktion gebacken?
Vergleichsfunktion:
Code: Alles auswählen
bool CompareHash( Dedupe::FileInfo lhs, Dedupe::FileInfo rhs )
{
return (lhs.GetHash() > rhs.GetHash());
}
Sortierzeile:
Code: Alles auswählen
std::sort( Tmp.begin(), Tmp.end(),
boost::bind( &Dedupe::Core::Kernel::CompareHash, this, _1, _2 ) );
Den Zugriff auf die Membervariable bekomme ich so hin:
Code: Alles auswählen
std::sort(Tmp.begin(), Tmp.end(), &boost::lambda::_1->*&Dedupe::FileInfo::Hash >
&boost::lambda::_2->*&Dedupe::FileInfo::Hash );
Allerdings ist dieser Member private und daher müsste ich über die Memberfunktion GetHash() zugreifen. Das bekomme ich nicht hin. Vorschläge?
Re: Lambda Funktionen die Memberfunktionen rufen
Verfasst: Di Jan 03, 2012 11:00 pm
von Kerli
Sollte es nicht eigentlich ganz gleich funktionieren?
Code: Alles auswählen
std::sort(Tmp.begin(), Tmp.end(), (boost::lambda::_1->*&Dedupe::FileInfo::GetHash)() >
(boost::lambda::_2->*&Dedupe::FileInfo::GetHash)() );
bzw. sollte es nicht auch so gehen:
Code: Alles auswählen
std::sort(Tmp.begin(), Tmp.end(), boost::lambda::_1->GetHash() >
boost::lambda::_2->GetHash() );
Ansonsten, warum verwendest du nicht die eingebauten C++ Lambdafunktionen? Die sind deutlich vielseitiger und viel einfacher zu lesen.
Re: Lambda Funktionen die Memberfunktionen rufen
Verfasst: Mi Jan 04, 2012 8:05 am
von Bebu
Es funktioniert leider nicht so einfach, diese Varianten habe ich schon getestet und irgendetwas passt nicht. Google hat mir leider auch nichts brauchbares geliefert.
Bzgl. eingebauter Lambdafunktionen: Wie weit ist hier Visual Studio? Interessant wäre im Moment der Status von Lambda, Bind und Memberoperator = delete( Namen weiß ich nicht ). Ich fände es nicht gut, wenn Dedupe nur mit dem GCC kompiliert werden könnte.
Re: Lambda Funktionen die Memberfunktionen rufen
Verfasst: Mi Jan 04, 2012 9:14 pm
von Kerli
Bebu hat geschrieben:Es funktioniert leider nicht so einfach, diese Varianten habe ich schon getestet und irgendetwas passt nicht. Google hat mir leider auch nichts brauchbares geliefert.
Ich hab da etwas scheinbar ganz gutes gefunden:
http://www.cppbook.com/index.php?title= ... rithm_sort
Bebu hat geschrieben:Bzgl. eingebauter Lambdafunktionen: Wie weit ist hier Visual Studio? Interessant wäre im Moment der Status von Lambda, Bind und Memberoperator = delete( Namen weiß ich nicht ). Ich fände es nicht gut, wenn Dedupe nur mit dem GCC kompiliert werden könnte.
Lambdas hab ich schon mit dem gcc und VS verwendet, bind bin ich mir nicht ganz sicher, habe ich aber glaube ich schon bei beiden gesehen. Defaulted und Deleted Functions kann nur der gcc. Ich verwende für den aktuellen Status eigentlich immer diese Seite:
http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport
Re: Lambda Funktionen die Memberfunktionen rufen
Verfasst: Do Jan 05, 2012 8:06 am
von Bebu
boost::lambda::bind habe ich versucht, aber es wurde nicht erkannt. Vielleicht hätte ich dazu einen speziellen Header einbinden müssen. Ist jetzt auch nicht so wichtig, ich habe mich entschlossen die neuen Lambdafunktionen dafür zu nutzen. Sind fügen sich optisch sehr gut in den Code ein und sind wirklich leicht lesbar.