Per chiarire il concetto di base, riduciamolo a un esempio più semplice. Sebbene std::tie
sia utile per le funzioni che restituiscono (una tupla di) più valori, possiamo capirlo bene con un solo valore:
int a;
std::tie(a) = std::make_tuple(24);
return a; // 24
Cose che dobbiamo sapere per andare avanti:
Il prossimo passo è sbarazzarsi di quelle funzioni che ti ostacolano, così possiamo trasformare il nostro codice in questo:
int a;
std::tuple<int&>{a} = std::tuple<int>{24};
return a; // 24
Il passo successivo è vedere esattamente cosa succede all'interno di quelle strutture. Per questo, creo 2 tipi di T
sostituenti std::tuple<int>
e Tr
sostituenti std::tuple<int&>
, ridotti al minimo per le nostre operazioni:
struct T { // substituent for std::tuple<int>
int x;
};
struct Tr { // substituent for std::tuple<int&>
int& xr;
auto operator=(const T& other)
{
// std::get<I>(*this) = std::get<I>(other);
xr = other.x;
}
};
auto foo()
{
int a;
Tr{a} = T{24};
return a; // 24
}
E infine, mi piace sbarazzarmi delle strutture tutte insieme (beh, non è equivalente al 100%, ma è abbastanza vicino per noi e abbastanza esplicito da consentirlo):
auto foo()
{
int a;
{ // block substituent for temporary variables
// Tr{a}
int& tr_xr = a;
// T{24}
int t_x = 24;
// = (asignement)
tr_xr = t_x;
}
return a; // 24
}
Quindi, in pratica, std::tie(a)
inizializza un riferimento al membro dati a a
. std::tuple<int>(24)
crea un membro dati con valore 24
e l'assegnazione assegna 24 al riferimento membro dati nella prima struttura. Ma poiché quel membro dati è un riferimento associato a a
, che in pratica assegna 24
a a
.