Warum überladen die gängigen Smart-Pointer und Iteratoren den Operator ->* nicht?
-
Dabei wäre es doch nur konsequent - und trivial zu implementieren:
template <typename T> struct TheSmartPointer { ... template <typename SubT> SubT& operator ->* (SubT T::* mptr) { return operator * ().*mptr; } template <typename SubT> const SubT& operator ->* (SubT T::* mptr) const { return operator * ().*mptr; }Übersehe ich etwas?
Oder ist das nur ein weiteres nicht durchdachtes Feature?
-
audacia schrieb:
Dabei wäre es doch nur konsequent - und trivial zu implementieren:
...
Übersehe ich etwas?Es gibt den Operator: "->" und "", nicht aber "->".
cu André
-
Sicher? Möchtest du meinen Code nicht lieber erst ausprobieren?

-
Pumuckl hat nen Artikel über Operatorüberladung geschrieben. Punkt 3.17 liefert ne Erklärung zu ->*...
Gruß
Tobi
-
Tobias Gerg schrieb:
Pumuckl hat nen Artikel über Operatorüberladung geschrieben. Punkt 3.17 liefert ne Erklärung zu ->*...
Ist aber auch keine gute Erklaerung warum man bei smartpointern den ->* nicht ueberlaedt.
Ich muss gestehen es noch nie gemacht zu haben aber jetzt so direkt betrachtet: ich kann nicht begruenden warum ich es nicht gemacht habe (einfach nur weil ich es nie gesehen habe...). Und sowas muss man dann immer in frage stellen.
Was spricht gegen eine ueberladung des ->* bei smartpointern?
oder noch weiter:
warum muss man den ->* operator nicht auch immer ueberladen wenn man operator-> ueberlaedt?
-
@asc,
Standard 98, "5.5 Pointer-to-member operators"
Und in "13.5 Overloaded operators" steht er auch drin, dass man ihn überladen kann, im gegensatz zum anderen Pointer-to-member Operator .* der nicht überladen werden kann.Das Ding gibt es wirklich. Ich persönlich habe den erst bei der Verwendung von Boost kennen gelernt. Es scheint mir, dass dieser Operator extrem unbekannt ist.
@audacia,
Ich denke der Operator ist nicht vorhanden, weil er völlig unbekannt ist. Anders kann ich es mir jedenfalls nicht erklären. Oder die Leute lassen ihn weg, da man ihn über andere Operatoren bereits schon erreichen kann.Grüssli
-
Tobias Gerg schrieb:
Pumuckl hat nen Artikel über Operatorüberladung geschrieben. Punkt 3.17 liefert ne Erklärung zu ->*...
Okay, das ist mir wirklich neu das es diesen Operator gibt.
-
Nach ein paar weiteren Experimenten damit fiel mir auf, weshalb man ihn nicht überlädt: weil man dann nämlich konsequenterweise nicht nur für Element-, sondern auch für Methodenzeiger eine Überladung bereitstellen müßte, und dafür bräuchte man Perfect Forwarding und Variadic Templates. Auf das Forwarding könnte man verzichten, wenn ein objektgebundener Methodenzeiger, also z.B.
obj.*methodPointer, in Standard-C++ einen wohlgeformten Typen hätte (-> __closure) - aber dann bräuchte man immer noch Variadic Templates.Edit: Typographie.