Sto lavorando in un file che ha una determinata funzione con molti sovraccarichi, in questo modo:Il mio modello generico dovrebbe usare T o T &&?
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) { ... }
Sto cercando di aggiungere un nuovo sovraccarico che richiede solo un parametro, in questo modo:
template<typename T> inline X f(T impl, W w) {
return f(impl, w->getY(), w->getZ());
}
Uso i modelli in modo che tutte le varianti sopra descritte funzionino automaticamente con la mia nuova versione a due parametri.
Tuttavia, durante la revisione del codice mi è stato chiesto, "È T&&
migliore per evitare la copia?". Cioè, dovrei invece fare
template<typename T> inline X f(T&& impl, W w) {
return f(impl, w->getY(), w->getZ());
}
Non so davvero la risposta a questa domanda. Pensavo di aver capito riferimenti universali, ma non mi è familiare quando sono una buona idea o no. Quali sarebbero le conseguenze nella mia situazione di scegliere l'una rispetto all'altra?
Se dovessi tirare a indovinare, direi che dal momento che i tipi originali che T può sostituire sono tutti semplici da copiare (primitive, riferimenti, o puntatori) T & & non darà molto beneficio. Ma sono ancora curioso se ad es. qualsiasi tipo potrebbe essere passato alla versione T & & che non è stato possibile passare alla versione T o viceversa.
Se il chiamante vuole spostarsi, dovrebbe solo 'std :: move' l'argomento. Usando 'T && 'stai ** costringendolo ** a farlo. Usando solo "T" gli stai dando una scelta. –
questo non è vero quando si utilizzano modelli nel contesto dedotto –
Ah, non lo sapeva. Grazie per il chiarimento. –