यह वास्तव में थोड़ा परेशान है, एसडी :: प्रारंभकर्ता_सूची के लिए स्क्वायर ब्रैकेट ऑपरेटर नहीं है, क्योंकि एक विशिष्ट अनुक्रमणिका के लिए यादृच्छिक प्रत्यक्ष पहुंच की आवश्यकता एक उचित परिदृश्य है।
हालांकि, इस क्षमता कुछ सरल कोड के साथ जोड़ा जा सकता है:,
// the class _init_list_with_square_brackets provides [] for initializer_list
template<class T>
struct _init_list_with_square_brackets {
const std::initializer_list<T>& list;
_init_list_with_square_brackets(const std::initializer_list<T>& _list): list(_list) {}
T operator[](unsigned int index) {
return *(list.begin() + index);
}
};
// a function, with the short name _ (underscore) for creating
// the _init_list_with_square_brackets out of a "regular" std::initializer_list
template<class T>
_init_list_with_square_brackets<T> _(const std::initializer_list<T>& list) {
return _init_list_with_square_brackets<T>(list);
}
अब हम एक नया वैश्विक समारोह _ (अंडरस्कोर) नाम दिया है जो शायद विधि ++ एक वैश्विक सी के लिए एक अच्छा नाम नहीं है जब तक कि हम सी ++ के लिए कुछ "अंडरस्कोर-जैसी" उपयोगिता lib बनाना चाहते हैं, जिसमें इसका अपना नामस्थान होगा, अन्य सभी उपयोगी उपयोगों के लिए _ फ़ंक्शन को ओवरलोड करना होगा।
नई _ समारोह इस तरह अब इस्तेमाल किया जा सकता:
void f(std::initializer_list<int> list) {
cout << _(list)[2]; // subscript-like syntax for std::initializer_list!
}
int main() {
f({1,2,3}); // prints: 3
cout << _({1,2,3})[2]; // works also, prints: 3
return 0;
}
उल्लेखनीय यह है कि ऊपर दी गई समाधान प्रदर्शन के मामले में एक अच्छा सौदा अगर आप एसटीडी की कई मदों अधिक समय तक नहीं है: : _init_list_with_square_brackets
से ऊपर दिए गए सुझाए गए प्रकार की एक अस्थायी वस्तु के रूप में प्रारंभकर्ता_सूची बार-बार बनाई जाती है। जो फिर से आश्चर्य उठाता है कि यह मानक द्वारा क्यों प्रदान नहीं किया गया था।
स्रोत
2015-10-09 14:56:43
मुझे लगता है क्योंकि इसका मुख्य उपयोग-मामला अनुक्रमिक रूप से संसाधित होने वाली सूची है। – PlasmaHH
एक सामान्य उपयोग केस एक निर्माता के लिए है जो स्मृति के ब्लॉक को आवंटित करता है और 'allocator.construct (p, v) 'का उपयोग करके ब्लॉक में तत्वों को बनाता है।हालांकि सूची को अनुक्रमिक रूप से संसाधित किया गया है, बाहरी फॉर-लूप में पहले से ही एक काउंटर है जो स्वयं को 'ऑपरेटर []' वाक्यविन्यास में उधार देता है। –
@ शून्य-सूचक क्या आप सामान्य रूप से इन परिस्थितियों में * कॉपी * नहीं करेंगे? इस तरह आपको लूप की आवश्यकता नहीं है, और मैं आम तौर पर एक स्पष्ट लूप से बचता हूं। हालांकि सवाल अभी भी वैध है। –