Temel kavramı netleştirmek için daha basit bir örneğe indirelim. Daha std::tie
fazla değer döndüren işlevler (bir demet) için yararlı olsa da , bunu tek bir değerle gayet iyi anlayabiliriz:
int a;
std::tie(a) = std::make_tuple(24);
return a; // 24
İlerlemek için bilmemiz gereken şeyler:
Sonraki adım, yalnızca önünüze çıkan işlevlerden kurtulmaktır, böylece kodumuzu buna dönüştürebiliriz:
int a;
std::tuple<int&>{a} = std::tuple<int>{24};
return a; // 24
Bir sonraki adım, bu yapıların içinde tam olarak ne olduğunu görmektir. Bunun için, operasyonlarımız için çıplak asgari düzeye indirilmiş 2 tip T
ikame std::tuple<int>
ve Tr
ikame oluşturuyorum std::tuple<int&>
:
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
}
Son olarak, yapılardan hep birlikte kurtulmayı seviyorum (peki,% 100 eşdeğer değil, ama bizim için yeterince yakın ve buna izin verecek kadar açık):
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
}
Yani temel olarak, std::tie(a)
bir veri üyesi referansını başlatır a
. std::tuple<int>(24)
değeri olan bir veri üyesi yaratır 24
ve atama, birinci yapıdaki veri üyesi referansına 24 atar. Ancak bu veri üyesi, a
temelde atanan bir referans olduğu 24
için a
.