Mit GCC 4.8.0 haben wir einen Compiler, der den automatischen Rückzugstypabzug unterstützt und Teil von C ++ 14 ist. Mit -std=c++1y
kann ich das machen:
auto foo() { //deduced to be int
return 5;
}
Meine Frage ist: Wann sollte ich diese Funktion verwenden? Wann ist es notwendig und wann wird der Code sauberer?
Szenario 1
Das erste Szenario, an das ich denken kann, ist wann immer möglich. Jede Funktion, die auf diese Weise geschrieben werden kann, sollte sein. Das Problem dabei ist, dass der Code möglicherweise nicht immer besser lesbar ist.
Szenario 2
Das nächste Szenario besteht darin, komplexere Rückgabetypen zu vermeiden. Als sehr leichtes Beispiel:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
Ich glaube nicht, dass dies jemals wirklich ein Problem sein würde, obwohl ich denke, dass es in einigen Fällen klarer sein könnte, wenn der Rückgabetyp explizit von den Parametern abhängt.
Szenario 3
Um Redundanz zu vermeiden:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
In C ++ 11 können wir manchmal nur return {5, 6, 7};
einen Vektor ersetzen, aber das funktioniert nicht immer und wir müssen den Typ sowohl im Funktionsheader als auch im Funktionskörper angeben. Dies ist rein redundant, und der automatische Abzug des Rückgabetyps erspart uns diese Redundanz.
Szenario 4
Schließlich kann es anstelle sehr einfacher Funktionen verwendet werden:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
Manchmal schauen wir uns jedoch die Funktion an, um den genauen Typ zu erfahren, und wenn sie dort nicht bereitgestellt wird, müssen wir zu einem anderen Punkt im Code gehen, z. B. wo pos_
deklariert wird.
Fazit
Welche dieser Szenarien erweisen sich bei diesen Szenarien tatsächlich als eine Situation, in der diese Funktion hilfreich ist, um den Code sauberer zu gestalten? Was ist mit Szenarien, die ich hier nicht erwähnt habe? Welche Vorsichtsmaßnahmen sollte ich treffen, bevor ich diese Funktion verwende, damit sie mich später nicht beißt? Gibt es etwas Neues, das diese Funktion auf den Tisch bringt und das ohne sie nicht möglich ist?
Beachten Sie, dass die mehreren Fragen dazu dienen sollen, Perspektiven zu finden, aus denen diese beantwortet werden können.
->decltype(t+u)
durch automatischen Abzug SFINAE tötet.