ich in einer Datei arbeite, die eine bestimmte Funktion mit vielen Überlastungen hat, etwa so:Sollte meine generische Vorlage T oder T && verwenden?
inline X f(ScriptWrappable* impl, Y y, Z z) { ... }
inline X f(Node* impl, Y y, Z z) { ... }
inline X f(RawPtr<T> impl, Y y, Z z) { ... }
inline X f(const RefPtr<T>& impl, Y y, Z z) { ... }
inline X f(ScriptWrappable* impl, Y y, Z z) { ... }
inline X f(const String& impl, Y y, Z z) { ... }
inline X f(int64_t impl, Y y, Z z) { ... }
template<typename T, size_t capacity> inline X f(const Vector<T, capacity>& impl, Y y, Z z) { ... }
Ich versuche, eine neue Überlastung hinzuzufügen, die nur einen Parameter, wie so erfordert:
template<typename T> inline X f(T impl, W w) {
return f(impl, w->getY(), w->getZ());
}
Ich verwende Vorlagen, so dass alle oben genannten Variationen automatisch mit meiner neuen Zwei-Parameter-Version funktionieren.
Allerdings wurde ich während der Überprüfung gefragt, "Ist T&&
besser für die Vermeidung von Kopie?". Das heißt, sollte ich stattdessen tun
Ich weiß nicht wirklich die Antwort auf diese Frage. Ich dachte, ich verstehe universelle Referenzen, aber ich weiß nicht, wann sie eine gute Idee sind oder nicht. Was wären die Konsequenzen in meiner Situation, eine über die andere zu wählen?
Wenn ich raten müsste, würde ich sagen, dass da die ursprünglichen Typen, für die T stehen kann, alle einfach zu kopieren sind (Primitive, Referenzen oder Zeiger) T & & wird nicht viel Nutzen bringen. Aber ich bin immer noch neugierig, wenn z.B. Alle Typen können an die Version T & & übergeben werden, die nicht an die T-Version übergeben werden konnte oder umgekehrt.
Wenn der Anrufer sich bewegen möchte, sollte er nur das Argument "std :: move" bewegen. Indem Sie 'T &&' verwenden, zwingen Sie ** ihn dazu. Wenn Sie nur 'T' verwenden, geben Sie ihm die Wahl. –
dies ist nicht wahr, wenn Vorlagen in abgeleiteten Kontext verwendet –
Ah, wusste das nicht. Danke für die Klarstellung. –