Funktion überladen



  • Moin moin!
    Ich würde gerne eine Funktion überladen und zwar in dieser Art und Weise:

    int Funktion(void)
    
    char Funktion(void)
    

    Leider klappt das so nicht.

    Wie bekomme ich das aber hin? Es muss doch dazu eine Lösung in C++ geben, oder?

    Tobias



  • Nein anhand der Rückgabewerte kann eine Funktion nicht überladen werden. Wenn du sowas machen wilst, dann kommst du nicht drum herum das in der Parameterliste zu machen. (Ob mit einem nützlichen Parameter oder nicht sei dahingestellt, aber ich persönlich würde einen anderen Funktionsnamen wählen).



  • Nein. Rückgabetypen werden bei der Funktionsauswahl nicht berücksichtigt.
    Je nach deinem Ziel könnte vielleicht Templategeschubse und Funktion<char>() das Richtige sein.



  • Das heißt, dass ich keine Chance habe eine Funktion mit unterschiedlichen Rückgabewerten zu erstellen?
    Das würde natürlich meine ganze Programmplannung durcheinander bringen. 😞
    Dabei dachte ich, ich hätte schon mal ein Funktion benutzt, welche so etwas angeboten hätte.



  • int Funktion();
    
    char Funktion(char ich_bin_die_char_version_aber_nur_ein_dummy);
    

    Geht.



  • Das Problem ist, wenn du dann nur Funktion(); schreibst, also den Rückgabewert nicht entgegen nimmst, wie soll dann der Compiler wissen, welche Version gemeint ist? Aus diesem Grund wurde eine Überladung nur Anhand des Rückgabetyps verboten.



  • Knall doch einfach nen namespace drum 😕



  • Kóyaánasqatsi schrieb:

    Knall doch einfach nen namespace drum 😕

    OK, nun muss ich aber mal ganz blöd fragen: Was ist ein namespace?



  • navyseabear schrieb:

    OK, nun muss ich aber mal ganz blöd fragen: Was ist ein namespace?

    namespace test
    {
    	void funk1()
    	{
    	}
    };
    
    void funk1()
    {
    }
    

    Kannst das erste funk1 also über den Namensraum test erreichen: test::funk1();. Aber im nachhinein weiß ich nicht ob es eine optimale Lösung in deinem Fall wäre.



  • Kóyaánasqatsi schrieb:

    Kannst das erste funk1 also über den Namensraum test erreichen: test::funk1();. Aber im nachhinein weiß ich nicht ob es eine optimale Lösung in deinem Fall wäre.

    nein, ich denke das wäre nicht so optimal. Vermutlich werde ich einfach mehrere Versionen meiner Funktion erstellen müssen mit unterschiedlichen Namen. Ist zwar nicht so schön, dafür aber funktioniert es.

    Habt aber mal vielen Dank. Hat mir wirklich gedanklich weiter geholfen.

    Tobias



  • Schon mal an Template-Traits oder Spezialisierung gedacht? Vielleicht könnte man sie in deinem Fall ja anwenden.



  • navyseabear schrieb:

    nein, ich denke das wäre nicht so optimal. Vermutlich werde ich einfach mehrere Versionen meiner Funktion erstellen müssen mit unterschiedlichen Namen. Ist zwar nicht so schön, dafür aber funktioniert es.

    Wieso nicht so schön? Kannst du einen problembezogenen Code posten, inwiefern benötigst du dieses Verhalten?

    Grundsätzlich wären benutzerdefinierte Konvertierungsoperatoren auch noch eine Möglichkeit, sind je nachdem aber die falsche Wahl.



  • Wenn du immer den Rückgabewert verwenden willst, wäre vielleicht auch folgendes möglich:

    void func(char& result);
    void func(int& result);
    
    // Aufruf: statt char c = func();
    char c;
    func(c);
    

    Dann findet der Compiler selbstständig die richtige Version.


Log in to reply