(ध्यान दें: tuple
और tie
बूस्ट या सी ++ 11 से लिया जा सकता है।)
केवल दो तत्वों के साथ छोटी संरचनाएं लिखते समय, मैं कभी-कभी एक का चयन करता हूं std::pair
, क्योंकि उस डेटाटाइप के लिए सभी महत्वपूर्ण सामान पहले से ही किया जाता है, जैसे कि operator<
सख्त-कमजोर-ऑर्डर करना ।
हालांकि downsides बहुत बेकार चर नाम हैं। यहां तक कि अगर मैंने खुद को बनाया है typedef
, तो मुझे 2 दिन बाद याद नहीं होगा first
कि second
वास्तव में क्या और क्या था, खासकर अगर वे दोनों एक ही प्रकार के हैं। यह दो से अधिक सदस्यों के लिए और भी बदतर हो जाता है, क्योंकि घोंसले के शिकार pair
बहुत ज्यादा बेकार है।
उसके लिए अन्य विकल्प एक हैtuple
या तो बूस्ट या सी ++ 11 से, लेकिन यह वास्तव में किसी भी अच्छे और स्पष्ट नहीं दिखता है। इसलिए मैं किसी भी आवश्यक तुलना संचालकों सहित, स्वयं संरचना लिखने के लिए वापस जाता हूं।
चूंकि विशेष रूप से operator<
काफी बोझिल हो सकता है, मैंने इस पूरी गड़बड़ी को रोकने के बारे में सोचा था कि केवल इसके लिए परिभाषित संचालन पर निर्भर होकर tuple
:
उदाहरण के लिए operator<
, सख्त-कमजोर-आदेश के लिए उदाहरण:
bool operator<(MyStruct const& lhs, MyStruct const& rhs){
return std::tie(lhs.one_member, lhs.another, lhs.yet_more) <
std::tie(rhs.one_member, rhs.another, rhs.yet_more);
}
( tie
एक बनाता है tuple
के T&
पारित कर दिया तर्कों से संदर्भ।)
संपादित करें : @DeadMG से निजी तौर पर विरासत में लेने tuple
का सुझाव बुरा नहीं है, लेकिन इसमें कुछ कमियां हैं:
- यदि ऑपरेटर स्वतंत्र हैं (संभवतः मित्र), तो मुझे सार्वजनिक रूप से विरासत में प्राप्त करने की आवश्यकता है
- कास्टिंग के साथ, मेरे कार्यों / ऑपरेटरों (
operator=
विशेष रूप से) को आसानी से बायपास किया जा सकता है tie
समाधान के साथ , मैं कुछ सदस्यों को छोड़ सकता हूं यदि वे आदेश देने के लिए कोई मायने नहीं रखते हैं
क्या इस कार्यान्वयन में कोई कमियां हैं जिन पर मुझे विचार करने की आवश्यकता है?
tie
बिट-फील्ड सदस्यों पर लागू नहीं किया जा सकता है।
tie(...)
कॉल विभिन्न ऑपरेटरों (=, ==, <, आदि) में डुप्लिकेट होने जा रहे हैं, तो आप एक निजी इनलाइन विधि लिख सकते हैं make_tuple(...)
कि वे इनकैप्सुलेट करें और फिर विभिन्न अन्य स्थानों से कॉल करें, जैसे कि return lhs.make_tuple() < rhs.make_tuple();
(हालांकि वापसी प्रकार से) इस विधि को घोषित करने के लिए मजेदार हो सकता है!)
auto tied() const{ return std::tie(the, members, here); }