Frage

Warum gehen wir nicht sehen, C-ähnlichen Sprachen, die für Callables mit Polymorphismus in dem Rückgabetyp erlauben? Ich konnte sehen, wie die zusätzliche Typinferenz eine Hürde sein würde, aber wir haben viele Sprachen mit vollwertiges Typinferenz Systeme (die Arbeit für die Höhe der „Arbeit“ variiert).

Edit: Mit dem Polymorphismus Rückkehr Typ I die Funktion Signatur in dem Rückgabetyp nur bedeuten, zu überlasten. Zum Beispiel, C ++ und Java erlauben nur in der Art der formalen Parameter Überlastung, nicht in dem Rückgabetyp.

War es hilfreich?

Lösung

Wenn von „Rückgabetyp Polymorphismus“ Sie meinen, eine Überlastung auf der Grundlage der Rückgabewert Typ, bin ich über andere Sprachen nicht sicher, aber für C ++ hier ist die Antwort (so ziemlich aus dem Maul des Pferdes):

Funktionsrückgabetypen kommen nicht ins Spiel in der Überladungsauflösung, nur weil Stroustrup (I mit dem Input von anderen C ++ Architekten übernimmt) wollten die Überladungsauflösung ‚Kontext unabhängig‘ sein. Siehe 7.4.1 - „Überladen und Rückgabetyp“ aus der „C ++ Programmiersprache, Third Edition“.

  

Der Grund ist, zu halten Auflösung für   ein einzelner Bediener oder Funktion   rufen kontextunabhängig ist.

Sie wollten es nur auf der Grundlage, wie die Überlastung genannt wurde - nicht, wie das Ergebnis verwendet wurde (wenn es überhaupt verwendet wurde). Tatsächlich sind viele Funktionen aufgerufen, ohne das Ergebnis mit oder wäre das Ergebnis als Teil eines größeren Ausdrucks verwendet werden. Ein Faktor, den ich bin sicher, kam ins Spiel, wenn sie beschlossen war, dass, wenn der Rückgabetyp Teil der Auflösung gibt es viele Anrufe zu überladenen Funktionen sein würde, die mit komplexen Regeln gelöst werden müßte oder müßte die Compiler werfen ein Fehler, dass der Anruf war nicht eindeutig.

Und Herr weiß, C ++ Überladungsauflösung ist komplex genug, wie es steht ...

Andere Tipps

Ich würde gerne diese Funktion in einer Sprache zu sehen, nicht nur so, dass Funktion foo einen Doppel- oder ein int oder einen String zurückgeben können, aber auch so, dass foo könnten eine Struktur oder Objekte verschiedener Klassen zurück. Disambiguieren Anrufe würden ziemlich trivial sein - wenn der Anruf nicht eindeutig ist, erfordern eine gegossene den Rückgabetyp gewünschten auszuwählen. Beispiel:

string s = foo();    //foo returns a string
double x = foo();    //foo returns a double
int i = foo();       //foo returns an integer
float f = (float)(int)foo();    //call the int foo and convert to float

zusätzlich

Animal a = fooFactory();    //fooFactory returns an Animal
Plant p = fooFactory();     //foofactory returns a Plant

diese Situationen kommen nicht sehr oft, aber wenn sie es tun, die Abhilfe ist oft ziemlich hässlich ...

double x = (double)foo();

Die oben ist nicht eindeutig, wenn es Versionen von foo sind (), das Doppel zurückkehren kann, int, float, etc.

In C ++ Sie diese mit Klassen zu einem großen Teil zu tun. Zum Beispiel, sagen, dass ich einen Datentyp haben, die routinemäßig auf ASCII am Eingang und Ausgang umgewandelt wird;

typedef char* pchar;

class   MyType
{
public:

 operator pchar() { return(ConvertToASCII()); }
 MyType& operator=(char* input) { ConvertFromASCII(input); return(*this); }

 pchar ConvertToASCII();
 void ConvertFromASCII(pchar ASCII);
}

Diese Art der Sache ist oft in C ++ Frameworks verwendet. Zum Beispiel haben einen Blick auf die implmentation der MFC CString Klasse. IMHO ist es ein sehr nützliches Werkzeug, wenn auch gefährlich unter bestimmten Umständen.

Durch die automatische Umwandlung von Typen, ist es nicht offensichtlich ist, zu wissen, welche zu nennen funktionieren, wenn Rückgabetypen sind in der Nähe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top