#include <iostream>
using namespace std;
template <class X, class Y>
Y big(X a, Y b)
{
if (a > b)
return (a);
else return (b);
}
int main()
{
cout << big(32.8, 9);
}
Hier verwende ich Vorlagen in CPP. Wenn ich also die Funktion big
aufrufe, die Argumente double
und int
Typ umgeht , möchte ich die Rückantwort, die lautet double
. Den Typ hier gibt es 32
statt 32.8
.
Wie erhalte ich meine gewünschte Ausgabe? Wie schreibe ich einen richtigen Rückgabetyp big
?
c++
function
templates
return-type
function-templates
Rakshanda Meshram
quelle
quelle
std::max
es implementiert wird. Der Rückgabetyp einer Funktion muss zur Kompilierungszeit in C ++ bekannt sein. Daher kann dieser Rückgabetyp nicht vom Laufzeitwert Ihrer Parameter abhängen. Aus diesem Grund müssen für eine solche Funktion beide Parameter denselben Typ haben (dh Typ X, aber nicht Y).Antworten:
Eine Funktion kann nur einen Rückgabetyp haben, der zur Kompilierungszeit bekannt sein muss. Sie können jedoch
std::common_type
einen Typ zurückgeben, in den beide Parameter implizit konvertiert werden können.Das wäre
Und um sicherzustellen , dass es sich um eine tatsächlich zurückgibt ,
double
wenn übergeben einint
unddouble
wir tun können:Welche druckt
PS:
std::common_type
Kann den ternären Operator hinter den Szenen verwenden und als solche unterscheidet sich diese Lösung nicht wesentlich von den anderen Antworten (auto
+ ternär). Die wahre Stärke vonstd::common_type
ist, dass es eine beliebige Anzahl von Parametern akzeptiert.quelle
Der Rückgabetyp muss zur Kompilierungszeit festgelegt werden. Sie können die nachfolgende Rückgabe mit einem bedingten Operator verwenden , wenn Sie auf c ++ 11 beschränkt sind .
Live sehen
Wenn Sie jedoch Zugriff auf c ++ 14 oder höher haben, reicht die
auto
Rückgabe aus, da der Compiler den richtigen Typ ableitet, wenn Sie ihn zusammen mit dem bedingten Operator wie folgt verwenden:Live sehen
quelle
const
).Wenn Sie Ihren Rückgabetyp als
Y
undint
als zweiten Parameter markieren , haben Sie klar angegeben, dass dies einY
istint
. Hier gibt es keine Überraschungen.Dadurch werden alle vier korrekten Werte auf dem Bildschirm gedruckt.
https://godbolt.org/z/fyGsmo
Eine wichtige Sache ist, dass dies nur für Typen funktioniert, die miteinander verglichen werden können, dh der Compiler konvertiert implizit einen Typ für den Vergleich in den anderen.
WICHTIG : Die Parameter müssen als Referenz verwendet werden, um undefiniertes Verhalten zu vermeiden. Dies hat mit dem Rückgabetyp zu tun, an dem ich hartnäckig festhalte.
decltype(auto)
kann Verweise auf Typen zurückgeben. Wenn Sie der Funktion etwas Lokales zurückgeben (Anzahl der Argumente), erhalten Sie ein undefiniertes Verhalten.quelle
Dies ist aller Wahrscheinlichkeit nach nicht die richtige Lösung für Ihre genaue Situation - die anderen Antworten sind wahrscheinlich viel näher an Ihren Wünschen.
Wenn Sie jedoch aus irgendeinem Grund zur Laufzeit wirklich ganz andere Typen zurückgeben müssen, besteht die richtige Lösung (seit c ++ 17 ) darin, a zu verwenden
std::variant
, was eine Art typsichere Vereinigung ist.Beachten Sie, dass es dann Sache des Anrufers ist, mit dem zurückgegebenen Wert umzugehen, höchstwahrscheinlich mit
std::visit
oder ähnlichem.quelle
Es gibt int zurück, weil Y ein int ist und es die 32.8 in es umwandelt. Wenn Sie big 32,82 genannt haben, ist dies ein float, aber 8 ist ein int und der Funktionsrückgabetyp ist Y, was auch int ist.
Sie können dies nicht wirklich beheben, da Sie zur Laufzeit wissen müssen, welcher Typ große Renditen liefert. Machen Sie also a und b zum selben Typ:
quelle