Überlastung durch den Rückgabetyp
Las ich einige Fragen hier SO zu diesem Thema, die scheint noch verwirrend für mich. Ich habe gerade angefangen zu lernen, C++, und ich habe nicht studiert Vorlagen oder noch einen operator überladen und so.
Nun gibt es eine einfache Möglichkeit, um eine überlastung
class My {
public:
int get(int);
char get(int);
}
ohne Vorlagen oder seltsames Verhalten? oder sollte ich einfach
class My {
public:
int get_int(int);
char get_char(int);
}
?
mögliche Duplikate von überladen von Funktionen durch den Rückgabetyp?
Ich mag deinen Kommentar. Kurz, aber völlig solide.
V-aktuell gibt es bereits eine solche Mehrdeutigkeit mit der Einnahme der Adresse einer überladenen Funktion. In einem solchen Fall sollte es einige geben der Erwartung Ausdruck. In Fall gibt es nicht das Programm ist schlecht ausgebildet. Und dies ist bereits umgesetzt. Ich glaube nicht, es werde sehr schwierig sein, die gleichen Regeln, die für die Umsetzung überladen von Funktionen durch den Rückgabetyp. Also in deinem konkreten Beispiel Mehrdeutigkeiten entfernt werden, mit einer Besetzung, zu der zurückgegebene Typ. Instancing mit
Wenn Sie erreichen hier, ich denke, die beste Wahl, es zu denken, der zwei unterschiedliche Funktionsnamen, wie vorgeschlagen, durch Luchian.
Ich mag deinen Kommentar. Kurz, aber völlig solide.
V-aktuell gibt es bereits eine solche Mehrdeutigkeit mit der Einnahme der Adresse einer überladenen Funktion. In einem solchen Fall sollte es einige geben der Erwartung Ausdruck. In Fall gibt es nicht das Programm ist schlecht ausgebildet. Und dies ist bereits umgesetzt. Ich glaube nicht, es werde sehr schwierig sein, die gleichen Regeln, die für die Umsetzung überladen von Funktionen durch den Rückgabetyp. Also in deinem konkreten Beispiel Mehrdeutigkeiten entfernt werden, mit einer Besetzung, zu der zurückgegebene Typ. Instancing mit
int
Rückgabewert wird wie folgt Aussehen (int)get(9)
und mit char
wie diese (char)get(9)
.Wenn Sie erreichen hier, ich denke, die beste Wahl, es zu denken, der zwei unterschiedliche Funktionsnamen, wie vorgeschlagen, durch Luchian.
InformationsquelleAutor Shoe | 2012-03-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein gibt es nicht. Sie können nicht überladen Methoden, basierend auf return geben.
Überlast Auflösung berücksichtigt, die Funktion Unterschrift. Eine Funktion Signatur ist aus:
Und hier ist das Zitat:
1.3.11 Signatur
Optionen:
1) ändern Sie die Methode name:
2) out-parameter:
3) Vorlagen... overkill in diesem Fall.
Die Vorlage-Lösung bedeutet, Mitglied Vorlagen:
My::get<T>(int)
. Es ist eine gültige alternative falls 1) Sie haben, um eine Menge von verschiedenen Typen, alle mit dem gleichen code (z.B.boost::lexical_cast<T>( someStringValue )
oder Sie müssen in der Lage sein, diese Funktionen aufrufen aus einer anderen Vorlage (myMy.get<T>( i )
, woT
ist ein argument dieses anderen Vorlage. Ansonsten, wie Luchian sagt, Sie sind übertrieben.Beachten Sie, dass die Grund können Sie sich nicht überlasten basierend auf der Rückgabetyp ist, dass C++ können Sie verwerfen den Wert von einem Funktionsaufruf. Also, wenn Sie einfach als
my.get(0);
würde der compiler keine Möglichkeit haben, zu entscheiden, welches Stück code ausgeführt werden soll.in diesem Fall sollte es werfen compiler-Fehler nur in solchen Fällen, ansonsten sollte er Rückschlüsse auf die Art, wie es in so viele andere Szenarien bereits.
für die gleiche Argumentation
void foo(int x = 0) {} void foo(double x = 0) {}
sollte verboten werden. Allerdings ist es nicht. Nur in dem Fall, wo der compiler wirklich nicht unterscheiden kann (foo()
) werden Sie einen Fehler erhaltenInformationsquelleAutor Luchian Grigore
Ist es möglich, aber ich bin nicht sicher, dass es eine Technik, die ich empfehlen würde, für
Anfänger. Wie in anderen Fällen, wenn Sie wollen, dass die Wahl der Funktionen
hängt davon ab, wie der Rückgabewert verwendet wird, verwenden Sie einen proxy; zuerst definieren
Funktionen wie
getChar
undgetInt
eine generischeget()
diegibt einen Proxy wie diese:
Verlängern, um so viele Arten, wie Sie benötigen.
Überall, aber mit den üblichen Einschränkungen über implizite Konvertierungen. Sie laufen Gefahr, von der Einführung von Unklarheiten, die sonst nicht da sein. Bei einem Proxy, aber ich denke das Risiko ist gering---du bist nicht gehen zu müssen Instanzen des Proxy-Typ "andere", als in dem Fall, wo Sie wollen, dass die implizite Konvertierung. Beachten Sie auch, dass die Umwandlung in der proxy zählt als ein Benutzer definierten conversion. Wenn Sie brauchen
std::string
, und der proxy bietet nuroperator char const*()
es ist nicht zur Arbeit gehen.warum proxy verwenden hier, ich kann nicht denken von den Fällen, in denen proxy ist ein muss. Können Sie bieten? danke!
InformationsquelleAutor James Kanze
Nein, du kannst keine überlastung durch die Rückkehr Typ; nur von den parameter-Typen, und const/volatile-Qualifizierer.
Eine alternative wäre die "Rückkehr" mit einem Verweis argument:
obwohl ich wohl entweder eine Vorlage verwenden oder unterschiedlich benannte Funktionen wie dein zweites Beispiel.
int
Fehler-code.Seien Sie vorsichtig, char-und int-Typen werden implizit konvertiert.
InformationsquelleAutor Mike Seymour
Können Sie glauben, auf diese Weise:
Haben Sie:
Und es ist nicht zwingend, zum Einzug der Rückgabewert der Funktion beim Aufruf.
Nun, rufen Sie
So, Kein Sinn, wenn eine überlastung ist zulässig, basierend auf den Rückgabetyp.
InformationsquelleAutor Whoami
Gibt es keine Möglichkeit, um eine überlastung durch den Rückgabetyp in C++. Ohne die Verwendung von Schablonen mit
get_int
undget_char
wird die beste Sie tun können.template <class T> T get(int)
funktionieren würde?Ja, @Niklas, aber du musst es nennen wie
get<int>
oderget<char>
, die nicht wirklich gewinnen Sie viel überget_int
undget_char
wenn Sie nicht auch mit anderen template-features.Naja, der compiler kann ermitteln
T
wenn Sie so etwas wieT get(T)
. Wenn Sie anrufenget('a')
der compiler folgert daraus, dassT
ist einchar
und Sie muss nicht explizit nennenget<char>('a')
. Ich bin mir immer noch nicht sicher, ob dies ist standard, obwohl ich denke, es ist. FYI, die beiden GCC-und Clang-Unterstützung.Das ist vollkommen standard, @Netcoder, aber es ist nicht ein Fall der compiler die Aufzucht nur das zurück geben, was Sie vorgeschlagen wurde, möglich. In deinem Beispiel, der compiler leitet den argument-Typ, und sobald es weiß, dass es füllt den Wert der
T
überall sonst, einschließlich der return-Typ. Ich erwartete, Sie geben ein Beispiel der compiler AufzuchtT
für die Funktion in Niklas ' s Erster Kommentar.InformationsquelleAutor sepp2k
Können Sie nicht überlast-Methoden auf der Grundlage der Rendite-Arten. Ihre beste Wette ist, um erstellen Sie zwei Funktionen mit leicht unterschiedlicher syntax, wie in deinem zweiten code-snippet.
InformationsquelleAutor Frecklefoot
Während die meisten der anderen Kommentare zu diesem problem sind technisch korrekt, können Sie effektiv überlastung der Rückgabewert wenn kombinieren Sie es mit überlastung input-parameter. Zum Beispiel:
DEMO:
Den hieraus resultierenden ist:
Ich habe diese Methode erfolgreich, um wieder eine Vielzahl von Werten für eine C++ JSON-API läuft die Produktion. Hat Super geklappt! Während technisch nicht überladen durch den Rückgabetyp, führt er die Absicht, die unterschiedlichen Rückgabetypen mit der gleichen Funktion, name, gültig ist und klar ist C++, und hat wenig overhead (eine einzelne variable Instanziierung in der function call).
Aber dies ist nicht überladen durch den Rückgabetyp, es macht den job. macht mich sagen, "hinterhältig"
InformationsquelleAutor codechimp
können Sie nicht überladen einer Funktion basierend auf dem return Typ der Funktion.
Sie können overlead basiert auf der Art und Anzahl der Argumente, die diese Funktion übernimmt.
InformationsquelleAutor AlexDan