std::sort nach verschiedenen Objekteigenschaften mit Standardprädikaten (ohne Extrafunktion!)
-
Ja, aber ich verwende doch Funktionszeiger? Oder bin ich grad auf dem Holzweg??
struct some { int _a; int _b; int a(void) { return _a; }; int b(void) { return _b; }; some(int a1, int b1) : _a(a1), _b(b1) {} };
std::sort(l.begin(), l.end(), Compare( &some::a ));
-
Ahh, okay... du hast die const-qualifier an den Getter-Methoden vergessen.
-
Dachte ich auch mal Aber
... const int a(void) { return _a; }; ...
bringt auch nur
minimal5.cxx:70: error: no matching function for call to
Compare(const int (some::*)())'`
-
int a(void) const { return _a; };
So.
-
Im Prinzip ist dashier genau dasselbe wie die "Key Extractor" bei Boost.Multiindex.
http://www.boost.org/doc/libs/1_38_0/libs/multi_index/doc/reference/key_extraction.html
-
Decimad schrieb:
So.
Danke. Scheint Zeit zu sein, nach Hause zu gehen
-
knivil schrieb:
Da halt ich es wie die Mathematiker. Sie koennen auch Beweise ablehnen, ohne einen richtigen zu liefern.
Kritik ist okay, sofern sie begründet ist. Aber Aussagen wie "ich finde das schlecht, zu viel Code" helfen niemandem. Du bist übrigens immer noch nicht auf meine Fragen im letzten Post eingegangen. Insofern kann ich Tachyon nur zustimmen...
question123 schrieb:
Bin verwirrt. Ich krieg's nicht zum Laufen
Tut mir leid, ich hab die Funktionszeiger mal auf
const
-Versionen beschränkt, da diese für die meisten Fälle reichen sollten. Ausserdem scheint mir das sinnvoller als direkten Zugriff auf Member, da so die Zugriffsrechte der Klasse bewahrt werden können. Natürlich kannst du noch nach Belieben erweitern.
-
Wenn du die Funktionalität generisch implementieren willst ...
Genau das stoert mich. Warum sollte man es generisch loesen wollen/sollen? Normalerweise sind Klassen recht unterschiedlich (wenn nicht, dann sollte man nochmal drueber nachdenken), und eine generische Loesung nur auf ein oder zwei Typen anwendbar. Ausserdem kommt dann sowas raus:
Bin verwirrt. Ich krieg's nicht zum Laufen
da er sich nicht nur um die Sortierfunktion kuemmern muss, sondern sich auch noch durch die Templates wuehlen muss. Im Endeffekt wird es wahrscheinlich einfach nur kopiert. Boost::Lambda ist ok. Aber ich finde, es ist ungeeignet fuer Anfaenger. Die eigentliche Aussage, fuer eigene Klassen braucht man eigene Vergleichsfunktionen, ist voellig untergegangen.
-
knivil schrieb:
Genau das stoert mich. Warum sollte man es generisch loesen wollen/sollen? Normalerweise sind Klassen recht unterschiedlich (wenn nicht, dann sollte man nochmal drueber nachdenken), und eine generische Loesung nur auf ein oder zwei Typen anwendbar.
Es ging ja darum, ein Objekt (in einem Container) wahlweise nach gewissen Eigenschaften der Klasse zu sortieren, ohne für jede Eigenschaft eine eigene Funktion zu schreiben. Das ist wohl auch mit generisch gemeint. Und wieso sollte sich das nicht auszahlen? Man kann damit jede Klasse, die Get-Memberfunktionen mit der vorgegebenen Schnittstelle anbietet, nach irgendeinem Wert sortieren.
knivil schrieb:
Ausserdem kommt dann sowas raus:
Bin verwirrt. Ich krieg's nicht zum Laufen
da er sich nicht nur um die Sortierfunktion kuemmern muss, sondern sich auch noch durch die Templates wuehlen muss. Im Endeffekt wird es wahrscheinlich einfach nur kopiert. Boost::Lambda ist ok. Aber ich finde, es ist ungeeignet fuer Anfaenger.
Und jetzt? Wir können ihn ja dabei unterstützen. Er muss auch nicht alles hinter dem Code verstehen, um ihn anwenden zu können. Ich sags gerne nochmals: Wenn man meine Templates in einen separaten Header auslagert, braucht man nur die
Compare()
-Funktion richtig aufzurufen, und alles funktioniert. Wo liegt das Problem?Ich kann nicht ganz nachvollziehen, wie du hier krampfhaft versuchst, sämtliche Vorschläge in diesem Thread schlechtzureden, noch dazu, ohne selber etwas beizutragen. Der Threadersteller ist zufrieden, was willst du denn erreichen? Willst du ihn von einzelnen Funktionen für jedes Attribut überzeugen - dem Punkt, von dem er ursprünglich wegkommen wollte?
knivil schrieb:
Die eigentliche Aussage, fuer eigene Klassen braucht man eigene Vergleichsfunktionen, ist voellig untergegangen.
Was hat denn das damit zu tun? Das war nur eine Frage während des Threadverlaufs, die aber inzwischen geklärt sein sollte. Mit meiner Lösung braucht man beispielsweise nicht mehr spezifische Vergleichsfunktionen (es ging ums Schreiben des Codes, nicht welcher Code schlussendlich durch die Template-Instanziierungen erzeugt wird).
-
Was hat denn das damit zu tun?
Der Threadtitel lautet so ...
Er muss auch nicht alles hinter dem Code verstehen, um ihn anwenden zu können.
Da bin ich halt anderer Meinung.
Der Threadersteller ist zufrieden,
Ja, aber hat er was gelernt? Fraglich ...
-
knivil schrieb:
Er muss auch nicht alles hinter dem Code verstehen, um ihn anwenden zu können.
Da bin ich halt anderer Meinung.
Da kann man jetzt wieder mit der üblichen Gegenfrage kommen: wie weit muss man das verstehen, was "hinter" dem verwendeten Code steckt? Die hier präsentierten Lösungen könnten (mit ein wenig Zusatzarbeit, z.B. Unterstützung von const-gettern und nonconst-gettern) durchaus in einer Bibliothek angeboten werden, die man so verwendet wie sie daher kommt und wo es reicht das Interface zu kennen und anwenden zu können.
Deiner Aussage zufolge muss man aber alles hinter dem verwendeten Code verstehen, um ihn anwenden zu können. Weißt du wie die von deinem Compiler verwendete STL-Implementation intern funktioniert mit ihren vermutlich zigfach delegierten Implementationen von Iteratortemplates usw? Kennst du dich genug mit Assembler etc. aus um zu wissen wie die einzelnen Maschinenbefehle für diese Implementationen aussehen? Hast du Ahnung von Prozessoren und weißt wie dort die einzelnen Schritte auf die verschiedenen Register verteilt werden? Hast du das nötige Wissen von Mikroelektronik um zu wissen wie im Prozessor die einzelnen Schaltungen erfolgen? Wieviel Ahnung hast du von Halbleiterphysik, verstehst du was da innerhalb der einzelnen Schaltkreise auf dem Prozessor vor sich geht? In dem Zusammenhang fehlt dann auch noch Quantenphysik, weil bei heutigen Schaltzeiten und Schaltkreisabmessungen Tunneleffekte und andere Quantenmechanische Dinge eine Rolle spielen. Wenn man den Ansatz "du musst verstehn was dahinter steckt" wirklich ernst nimmt dann muss man vor dem ersten "Hello World" erstmal ein paar Jahre Grundlagenstudium absolvieren.knivil schrieb:
und eine generische Loesung nur auf ein oder zwei Typen anwendbar.
Noch so eine Aussage ohne jeden Beleg und Hintergrund. Schau mal im Netz was "generisch" heißt. Ganz bestimmt steht da dann nicht "etwas, was man nur ein oder zweimal anwenden kann". Mal ganz abgesehn davon dass die gezeigten Lösungen nur einen ganz normalen Getter für das benötigte Attribut erwarten, und den gibts in so ziemlich jeder Klasse die das entsprechende Attribut der Außenwelt zugänglich machen möchte.
-
@pumuckl
Wow. Du hast meine Aussage uebernommen, ueberspitzt und ad absurdum gefuehrt. Im uebrigen sehr poegelhaft. Konkret: Wenn man Templates einsetzt, dann sollte man wissen, was Templates im Prinzip sind. Ausserdem bezog ich mich mit der Haeufigkeit auf die Anwendbarkeit in diesem genau hier vorliegenden Problem. Hier gehts auch nicht um die Weltformel. Eine gewisse Abstraktion ist immer von Noeten. Wer Listen verwendet, sollte schon wissen, was es mit Listen auf sich hat. Er braucht sich nicht mit den einzelnen Assemblerbefehlen auseinandersetzen, da diese Ebene vom Compiler abstrahiert wird.Btw. die meisten Fragen koennte ich mit ja beantworten. Z.B. Fortgeschrittenenpraktikum: Messung von Relaxationszeit bei "optoelektronischen" Materialien ...
-
knivil schrieb:
Btw. die meisten Fragen koennte ich mit ja beantworten. Z.B. Fortgeschrittenenpraktikum: Messung von Relaxationszeit bei "optoelektronischen" Materialien ...
Nach vielen anderen Deiner Aussagen hier, wage ich das mal zu bezweifeln.
-
knivil schrieb:
Der Threadtitel lautet so ...
Hast du vielleicht auch den Eingangspost gelesen und versucht, ihn zu interpretieren? Falls nicht, nochmals: Es ging darum, nicht für jeden Member eine einzelne Vergleichsfunktion zu schreiben. Was mit meinem Code möglich ist.
knivil schrieb:
Ja, aber hat er was gelernt? Fraglich ...
Warum nicht? Er kann ohne Weiteres mit dem Code herumexperimentieren und bei Fragen wieder ins Forum schreiben. Falls es ihn nicht interessiert, was dahinter steckt - es ist nicht unsere Aufgabe, ihn zum Verstehen zu drängen. Das kann er selber entscheiden.
knivil schrieb:
Da bin ich halt anderer Meinung.
Das ist ja schön und gut, aber könntest du diese erläutern? Wieso sollte man beim Einsatz von Templates wissen, was Templates sind? (Davon abgesehen, warum gehst du davon aus, dass der Threadersteller es nicht weiss?) Und wo liegen denn die Grenzen? Wie genau muss man beim Einsatz von STL-Containern über Speicherverwaltung Bescheid wissen? Bei Streams über interne Puffer? Und sollte man zuerst Klassen anschauen (inklusive Objektorientierung, Vererbung, Polymorphie - von Templates zu schweigen), bevor man
std::string
nutzen darf?pumuckl hat zwar übertrieben, aber genau darauf läuft es hinaus. Irgendwo musst du die Abstraktionslinie ziehen. Und sofern du nicht gut argumentieren kannst, wieso hier nicht, aber in den anderen Fällen schon, solltest du mit solchen pauschalen Aussagen vorsichtiger sein.
Du bist im Übrigen immer noch nicht auf meine Frage eingegangen, was dich hier wirklich stört. Dass der Threadersteller womöglich nicht viel daraus lernt? Wieso soll "viel" Code automatisch böse sein? Was gäbe es für Alternativen? Begründe bitte deine Kritik. Bis jetzt scheint dein Standpunkt sehr subjektiv zu sein.
-
Knivil versteht die Templates (selber) nicht und glaubt daher, dass ihr Einsatz schlecht ist. Liegt doch klar auf der Hand.
-
jetzt scheint dein Standpunkt sehr subjektiv zu sein
Ja, ist er. Ich schrieb:
Ich finde die vorgeschlagenen Loesungen schlecht.
Soll ich staendig extra betonen, dass es meine Meinung ist? Der Satz faengt mit "Ich finde" an. Subjektiver geht es nicht. Es steht nicht da "Es ist schlecht", es ist nicht als Fakt dargestellt. Nimm es so, wie es dasteht, interpretiere nicht soviel zusaetzlich hinnein. Und schon garnicht wie mein Vorposter ueber mir. Sowas ist einfach nur bloed.
Ich finde halt, dass Problem sollte nicht generalisiert angegangen werden und die Templates sind fehl am Platz. Du bist halt anderer Meinung. Beide haben wir unsere Argumente vorgebracht. Soll der Orginalposter entscheiden ... Ist doch OK.
-
knivil schrieb:
Soll ich staendig extra betonen, dass es meine Meinung ist? Der Satz faengt mit "Ich finde" an. Subjektiver geht es nicht. Es steht nicht da "Es ist schlecht", es ist nicht als Fakt dargestellt.
Gewisse Sätze kamen aber so rüber, als ob es sich um ernsthafte Kritik handeln sollte - nur mit der Eigenschaft, dass keine Argumente folgten. Zum Beispiel:
Und man sieht wieder, wie aus einer simplen Sache unglaublich viel Code entsteht.
Warum sollte man es generisch loesen wollen/sollen? [...] eine generische Loesung nur auf ein oder zwei Typen anwendbar.
Oder auch der Versuch, die Forderung des Threaderstellers zu verdrehen. Und dann immer wieder einen Kritikpunkt herauszupicken und, sobald ich nachgefragt oder ein Gegenargument gebracht habe, nicht mehr darauf einzugehen.
Und wenn du über deine Meinung nicht diskutieren möchtest oder keine Rechtfertigung findest, warum stellst du sie dann in den Raum? Eine Diskussion basiert meistens auf Meinungen, die von deren Verfechtern mit Argumenten belegt werden. Wenn dir der zweite Teil nicht zusagt, solltest du vielleicht auch den ersten lassen - denn dieser provoziert eine Reaktion. Die reine Feststellung, dass es eine Person gibt, die von einer Sache das und das hält, bringt schliesslich niemanden weiter.
knivil schrieb:
Ich finde halt, dass Problem sollte nicht generalisiert angegangen werden und die Templates sind fehl am Platz. Du bist halt anderer Meinung. Beide haben wir unsere Argumente vorgebracht. Soll der Orginalposter entscheiden ... Ist doch OK.
Ja. Mich stört auch nicht, dass du dieser Ansicht bist, sondern dass du sie ständig in den Raum wirfst und als Kritik darstellst, ohne Begründungen zu liefern. Ich weiss zum Beispiel immer noch nicht, mit welchen Argumenten du dich gegen eine generische Lösung ausgesprochen hast. Aber nun gut...
-
Nexus schrieb:
knivil schrieb:
Warum sollte man es generisch loesen wollen/sollen? [...] eine generische Loesung nur auf ein oder zwei Typen anwendbar.
Da fehlt ein kleiner Satz davor, der Subjektivitaet ausdrueckt. Ich stelle die Templateloesung an sich in Frage, ganz einfach: das Problem ist fuer mich simpel, die vorgeschalgene Loesung erfordert 40 Zeilen Code. Die Signatur der Templatefunktionen ist viel laenger/groesser als deren Inhalt. Das meinte ich mit simples Problem viel Code. Eine simple Loesung ist, einfach eine extra Vergleichsfunktion zu schreiben. Ohne gehts nicht! Auch wenn wenn die generelle Loesung auf alles anwendbar ist, dass getter und setter hat, heisst das noch lange nicht, dass es gut ist, sie permanent einzusetzen oder dass staendig eingesetzt wird. Es gibt auch andere Moeglichkeiten, z.B. von einer gemeinsamen Basisklasse erben und fuer die Basisklasse eine entsprechende Vergleichsfunktion zu schreiben. Was besser ist, wird durch den Kontext bestimmt, der hier nicht erkennbar ist. Meine Meinung, meine Argumente, nur zusammengefasst. Falls du das nicht als Argumente zaehlst, dann kann ich auch nicht weiterhelfen.
-
knivil schrieb:
Da fehlt ein kleiner Satz davor, der Subjektivitaet ausdrueckt.
Das stimmt zwar, aber aus einem "Genau das stört mich" schliesse ich doch nicht, dass es dir nur um die subjektive Meinung geht?
knivil schrieb:
Falls du das nicht als Argumente zaehlst, dann kann ich auch nicht weiterhelfen.
Nein, das ist wirklich gut, vor allem mal zusammenhängend.
Das mit dem Kontext stimmt natürlich, da stimme ich dir zu. Ich würde für zwei Anwendungsfälle auch nicht ein solches Template einsetzen, aber ich habe hier grundsätzlich auf die Frage geantwortet, wie man spezifische Vergleichsfunktionen für jede Eigenschaft umgehen kann/generisch löst. Und wenn man die Vorlage mal hat, kann man sie jederzeit wiederverwenden...
-
Ich finde Happy Ends immer toll.