Darf man Standard-Funktionen wie sin und cos überladen?
-
Moinsen,
ich bastele an einem Großkreisrechner und habe mir dafür Klassen für Längen und Breitengerade geschrieben (um Überläufe abzufangen usw.).
Für trigonometrische Formeln brauche ich jetzt natürlich sinus und cosinus von Längengraden.
Statt
Position foo; // irgendwo foo.latitude().sine();würde ich gerne
sin(foo.latitude());schreiben können, also eine Überladung
double sin(const Latitude&);anbieten.
Latitude implizit nach double konvertierbar zu machen ginge für den Zweck ja auch, aber das möchte ich aus Gründen der statischen Typfehlererkenung (Längengrad auf Breitengrad addieren oder so) unbedingt vermeiden.
Daher meine Frage: Ist es erlaubt, Funktionenen wie sin, cos, atan, usw. zu überladen?
-
Klar darfst du das, macht die Standard-Bibliothek schließlich auch (z.B. für complex<> oder valarray<>).
Edit: Natürlich darfst du nichts im Namensraum "std" reinschreiben, aber in deinem eigenen Namensraum ist alles erlaubt, was nicht zu Mehrdeutigkeiten führt.
-
Musst du nicht. Was auch immer die Funktion latitude zurückgibt, schreib in dessen Namensraum eine Sinusfunktion (usw.). Dank König-Lookup wird diese Funktion automatisch gefunden und aufgerufen.
http://en.wikipedia.org/wiki/Argument-dependent_name_lookupGrüssli
-
cool, danke für die Antworten!