मुख्य अवधारणा को स्पष्ट करने के लिए, आइए इसे और अधिक मूल उदाहरण में कम करें। यद्यपि 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पदार्थ बनाता हूं, 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)डेटा सदस्य संदर्भ को इनिशियलाइज़ करता है a। std::tuple<int>(24)मान के साथ एक डेटा सदस्य बनाता है 24, और असाइनमेंट पहली संरचना में डेटा सदस्य संदर्भ में 24 असाइन करता है। लेकिन चूँकि वह डेटा सदस्य एक संदर्भ से जुड़ा होता है a, जो मूल रूप से असाइन 24होता है a।