เพื่อชี้แจงแนวคิดหลักเรามาลดเป็นตัวอย่างพื้นฐานมากขึ้น แม้ว่าstd::tie
จะมีประโยชน์สำหรับฟังก์ชั่นที่คืนค่า (ทูเพิล) มากกว่า แต่เราสามารถเข้าใจได้ดีเพียงแค่ค่าเดียว:
int a;
std::tie(a) = std::make_tuple(24);
return a; // 24
สิ่งที่เราต้องรู้เพื่อก้าวไปข้างหน้า:
ขั้นตอนต่อไปคือการกำจัดฟังก์ชันเหล่านั้นที่ขวางทางคุณเท่านั้นดังนั้นเราจึงสามารถแปลงรหัสของเราให้เป็นดังนี้
int a;
std::tuple<int&>{a} = std::tuple<int>{24};
return a; // 24
ขั้นตอนต่อไปคือการดูว่าเกิดอะไรขึ้นภายในโครงสร้างเหล่านั้น สำหรับสิ่งนี้ฉันสร้างT
สารทดแทน2 ประเภทสำหรับstd::tuple<int>
และTr
สารทดแทน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
}
และในที่สุดฉันก็ชอบที่จะกำจัดโครงสร้างทั้งหมดด้วยกัน (มันไม่เทียบเท่า 100% แต่มันใกล้พอสำหรับเราและชัดเจนพอที่จะอนุญาต):
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
}
ดังนั้นโดยทั่วไปเริ่มต้นการอ้างอิงข้อมูลสมาชิกไปstd::tie(a)
สร้างสมาชิกข้อมูลที่มีค่าและการกำหนดจะกำหนด 24 ให้กับการอ้างอิงสมาชิกข้อมูลในโครงสร้างแรก แต่เนื่องจากว่าข้อมูลสมาชิกคือการอ้างอิงผูกไว้กับที่โดยทั่วไปได้รับมอบหมายไปa
std::tuple<int>(24)
24
a
24
a