Lambda Funktionen die Memberfunktionen rufen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Lambda Funktionen die Memberfunktionen rufen

Beitrag von Bebu » Di Jan 03, 2012 8:04 am

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?
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Lambda Funktionen die Memberfunktionen rufen

Beitrag von Kerli » Di Jan 03, 2012 11:00 pm

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.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Lambda Funktionen die Memberfunktionen rufen

Beitrag von Bebu » Mi Jan 04, 2012 8:05 am

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.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Lambda Funktionen die Memberfunktionen rufen

Beitrag von Kerli » Mi Jan 04, 2012 9:14 pm

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
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Lambda Funktionen die Memberfunktionen rufen

Beitrag von Bebu » Do Jan 05, 2012 8:06 am

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.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Antworten