Supponiamo che io ho due struct
s:Perfetto inoltro di un membro di oggetto
struct X {};
struct Y { X x; }
Ho funzioni:
void f(X&);
void f(X&&);
Come faccio a scrivere una funzione g()
che prende Y&
o Y&&
ma perfetta inoltro X&
oppure X&&
a f()
, rispettivamente:
template <typename T>
void g(T&& t) {
if (is_lvalue_reference<T>::value) {
f(t.x);
} else {
f(move(t.x));
}
}
Il codice sopra riportato illustra la mia intenzione ma non è molto scalabile in quanto il numero di parametri aumenta. C'è un modo per farlo funzionare per l'inoltro perfetto e renderlo scalabile?
Credo che cambiare 'is_lvalue_reference :: value' a' is_lvalue_reference (t))> :: value' avrà la semantica desiderata, ma penso che la tua semantica desiderata sia discutibile ... –
ildjarn
(Scusa per la risposta pasticciata.) Direi che il motivo per cui non scala è perché il design è discutibile per cominciare. Che cosa significa "spostare" un subobject? In quale stato questo lascia l'oggetto principale? Anche se ci fosse un modo semplice per scrivere questo, sembra codice scarsamente strutturato ... –