Utilizzando una struttura modello come many
di seguito, è possibile restituire un set fisso di oggetti possibilmente non mobili e riceverli utilizzando il C++ 17 binding strutturato (auto [a,b,c] = f();
dichiara le variabili ab e c e assegna il loro valore da f restituendo ad esempio una struct o una tupla).Restituzione di aggregati variadici (struct) e sintassi per il modello variadic C++ 17 'construction deduction guide'
template<typename T1,typename T2,typename T3>
struct many {
T1 a;
T2 b;
T3 c;
};
// guide:
template<class T1, class T2, class T3>
many(T1, T2, T3) -> many<T1, T2, T3>;
auto f(){ return many{string(),5.7, unmovable()}; };
int main(){
auto [x,y,z] = f();
}
Come illustrato in queste due domande e risposte (Do std::tuple and std::pair support aggregate initialization? e soprattutto la accepted answer by ecatmur, anche Multiple return values (structured bindings) with unmovable types and guaranteed RVO in C++17), std::tuple
non supporta l'inizializzazione aggregata. Ciò significa che non può essere utilizzato per conservare e restituire tipi non amovibili. Ma una semplice struct come many
può fare questo, che porta alla domanda:
E 'possibile creare una versione variadica di many
che funzioni con un numero qualsiasi di argomenti?
Aggiornamento: in una versione di many
, sarà consentita la seguente sintassi di guida?
template<typename Args...>
many(Args...) -> many<Args...>;
Nota che c'è una proposta da qualche parte per sg come 'auto std :: tie (a, b, c) = ...'. – lorro
@lorro IMO è una cattiva idea: rende la funzionalità del linguaggio di base come funzione di libreria. Per non parlare del fatto che il compilatore dovrà risolvere potenziali "utilizzi", accordi con lo spazio dei nomi e altre cose. –
@Revolver_Ocelot: Penso anche che potrebbe essere fatto meglio, ma per alcuni motivi diversi/aggiuntivi: vale a dire, non è ortogonale ad altre caratteristiche. Il mio modo preferito per farlo sarebbe quello di consentire la dichiarazione delle variabili * ovunque *, inclusa la posizione dei parametri di funzione. L'altro problema che ho è che scriverò 'a = ...', mentre quello che intendi è chiamare il * costruttore * di 'decltype (a)', che sono due cose molto diverse. – lorro