कहें, मैं इनलाइन परिभाषित कई जोड़ों को फिर से शुरू करना चाहता हूं। क्या लिखने का एक छोटा रास्ता है:रेंज-जोड़ी सूची के लिए आधारित
for(auto pair : std::initializer_list<std::pair<int,int>>{{1,2}, {3,4}})
// ...
?
कहें, मैं इनलाइन परिभाषित कई जोड़ों को फिर से शुरू करना चाहता हूं। क्या लिखने का एक छोटा रास्ता है:रेंज-जोड़ी सूची के लिए आधारित
for(auto pair : std::initializer_list<std::pair<int,int>>{{1,2}, {3,4}})
// ...
?
बस निर्दिष्ट करें कि पहला तत्व एक जोड़ी है। बाकी स्वचालित रूप से निष्कर्ष निकाला जाएगा:
for(auto& pair : {std::pair<int,int>{1,2}, {3,4}})
;
braced संलग्न प्रारंभकर्ता std::initalizer_list
होने के लिए निष्कर्ष निकाला जाता है, और पहला तत्व एक जोड़ी सभी तत्वों एक जोड़ी के लिए एक initalizer होने के लिए की आवश्यकता होगी नामित होने के।
आप सी ++ 11 में चिह्नित है, लेकिन पूर्णता के लिए, यह सी ++ 17 में भी कम हो सकता है:
for(auto& pair : {std::pair{1,2}, {3,4}})
;
कारण वर्ग के लिए टेम्पलेट तर्क कटौती।
for(auto& pair : {std::make_pair(1,2), {3,4}})
;
हालांकि जाहिरा तौर पर यह सी ++ 17 संस्करण के रूप में कोड गोल्फ के लिए के रूप में उपयोगी नहीं है,: आपको लगता है कि नहीं है, तो, std::make_pair
से यदि आप टेम्पलेट तर्क कटौती के लाभ को बनाए रखना चाहते हो जाएगा ।
अच्छा है, धन्यवाद :) के आधार पर आपका जवाब, मुझे यह संस्करण भी मिला जो सी ++ 17: 'के लिए काम करता है (ऑटो जोड़ी: {std :: make_pair (1,2), {3,4}, {5,6}})' – IceFire
@IceFire - हाँ, यह सी ++ 11 में भी काम करता है। तर्क कटौती सी ++ 17 में 'make_pair' को प्रतिस्थापित कर सकती है। – StoryTeller
हां, मुझे यह सबसे अच्छा लगता है। मेरा कंपाइलर अब तक इसे स्वीकार नहीं करता है, हालांकि। वैसे भी, हमने सभी विकल्पों को कवर किया है – IceFire
अच्छा ol 'प्रकार उर्फ:
using pairlist = std::initializer_list<std::pair<int,int>>;
for(auto pair : pairlist{{1,2}, {3,4}})
{
// stuff happens here
}
आप उस प्रकार :) – StoryTeller
कि @StoryTeller कम नहीं है उर्फ कर सकते हैं, यह क्या है? – IceFire
लूप अभिव्यक्ति कम है। यदि आप एक से अधिक बार लूपिंग करते हैं तो इससे चीजें कम हो जाएंगी। – StoryTeller