Importer:Error:WasEmpty
-
Ich hab in den quellcode der STL von Visual Studio 2013 geguckt und da ist mir eine sache aufgefallen:
Nahezu alle operatoren werden außerhalb der klasse definiert,
es wird also stattbool operator > (const vector<T,Alloc>& o) { /*....*/ }innhalb der klasse
template<class T, class Alloc> bool operator > (const vector<T,Alloc>& l, const vector<T,Alloc>& r) { /*....*/ }außerhalb der klasse geschrieben.
Ich frage mich nun ob da irgendein struktureller vorteil oder so entsteht. Für mich sieht es einfach nur nach unnötiger schreibarbeit und sucherei aus...
-
Generell weiß ich den Grund auch nicht.
Allerdings kann man mit den globalen Operatoren teilweise wesentlich mehr machen, z.B. statt Klasse * int kann man auch int * Klasse überladen.
-
Marthog schrieb:
Generell weiß ich den Grund auch nicht.
Allerdings kann man mit den globalen Operatoren teilweise wesentlich mehr machen, z.B. statt Klasse * int kann man auch int * Klasse überladen.Das wird der Grund sein.
Überlädt man operator # einer Klasse C innerhalb der Klasse C, die man anhand eines Objekten vom Typ T erzeugen kann, ist folgendes legal:
some_c # some_t aber nicht some_t # some_c, weil das ausgeschrieben some_t.operator#(some_c) wäre, was illegal ist, wenn T bspw. 5 ist; 5.operator+(sth) ist illegal.
Als freie Funktion ist das aber erlaubt.
-
z.B. statt Klasse * int kann man auch int * Klasse überladen.
Das ist für vector kein Argument.
Für mich sieht es einfach nur nach unnötiger schreibarbeit und sucherei aus...
Vielleicht ist es bei denen einfach eine ganz pauschale Regel. Ist aber trotzdem bescheuert.
-
Arcoth schrieb:
Ist aber trotzdem bescheuert.
Ähm, nein. Binäre Operatoren macht man in der Regel aus Symmetriegründen global. Bescheuert wäre, es nur wegen Schreibarbeit nicht zu tun.
Globale Operatoren erlauben es, beide Argumente implizit zu konvertieren. Bei Member-Operatoren gilt das nur für das rechte Argument, was eine nicht-intuitive Asymmetrie mit sich bringt. Kommt zwar bei STL-Containern selten vor, ist aber nicht ausgeschlossen, denkt man an Boost.Assign.
Lest vielleicht mal den Artikel über Operatorüberladung in C++.
-
Globale Operatoren erlauben es, beide Argumente implizit zu konvertieren.
Das ist doch klar. (Edit²: Es hat sich so angehört, als ob ich es nicht wüsste
)Der Standard selbst schreibt vor, dass die Operatoren von Containern global überladen werden sollen (siehe Header Synopsis für <vector>, usw.). Das wird wohl der Grund sein. Boost.Assign kenne ich nicht, kannst du mal erklären inwiefern das für die Lib einen Unterschied macht?
-
Arcoth schrieb:
Das ist doch klar. (Edit²: Es hat sich so angehört, als ob ich es nicht wüsste
)Wenn es so klar ist, warum bezeichnest du das Ganze als bescheuert?

Arcoth schrieb:
Boost.Assign kenne ich nicht, kannst du mal erklären inwiefern das für die Lib einen Unterschied macht?
In der Bibliothek gibts Funktionen, die Objekte zurückgeben, welche implizit zu STL-Containern konvertierbar sind.
-
Nexus schrieb:
Wenn es so klar ist, warum bezeichnest du das Ganze als bescheuert?

Ich habe mich auf den speziellen Fall von
vectorbezogen, nicht allgemein. Dass das globale Überladen von Operatoren diesen Vorteil hat, dürfte jedem Leser dieses Threads klar sein.Trotzdem ist das Symmtrie-Argument bei Containern sehr schwach. Wer hat schon jemals diesen Fall mit Boost.Assign tatsächlich benötigt?
Aber prinzipiell stimmt das völlig, man sollte Operatoren allgemein immer global überladen. Ich nehme das 'bescheuert' natürlich zurück.