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.


  • Administrator

    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_lookup

    Grüssli



  • cool, danke für die Antworten!


Anmelden zum Antworten