कुछ विकल्प हैं जिनके बारे में मैं सोच सकता हूं, प्रत्येक अपनी खुद की कुरूपता के साथ।
एक स्पष्ट विकल्प संदर्भों के बजाय पॉइंटर्स (शायद unique_ptr
) का उपयोग करना है। बेशक, इस काम के लिए, इसे या तो ढेर, या कस्टम आवंटकों से आवंटन की आवश्यकता होती है। मुझे लगता है कि एक अच्छा आवंटक के साथ, इस दृष्टिकोण में कुछ योग्यताएं हैं। फिर फिर, ऑपरेटर ओवरलोडिंग सिर्फ बुरा हो जाएगा।
एक अन्य दृष्टिकोण उप-अभिव्यक्तियों को कॉन्स संदर्भ के बजाय मूल्य द्वारा संग्रहीत करना है। इस दृष्टिकोण की दक्षता बहुत संकलक-निर्भर है, लेकिन चूंकि आप मूल रूप से अस्थायी समूह के साथ काम कर रहे हैं, इसलिए मैं कल्पना करूंगा कि आधुनिक कंपाइलर प्रतियां (या कम से कम, बहुत सारी प्रतियां) को अनुकूलित कर सकते हैं।
अंतिम दृष्टिकोण आपको एक ही संरचना को आपके कोड में रखने की अनुमति देता है, लेकिन उपयोगकर्ता को अभिव्यक्ति का मूल्यांकन करने के लिए मजबूर करता है। यह आवश्यक है कि आपके पास केवल एक ही प्रकार का प्रकार हो, जो अभिव्यक्ति का अंतर्निहित प्रकार है (कहें, std::vector<int>
)। अभिव्यक्ति वर्गों में से कोई भी begin
और end
उनके लिए परिभाषित विधियों या कार्यों के साथ होना चाहिए, लेकिन केवल अंतर्निहित प्रकार में परिवर्तनीय होना चाहिए। इस तरह, for(auto x : expr)
जैसे कोड संकलन-समय पर असफल हो जाएंगे (क्योंकि expr
पुनरावर्तनीय नहीं है), लेकिन for(auto x : static_cast<vector<int>>(expr))
लिखना काम करता है क्योंकि अभिव्यक्ति का पहले ही मूल्यांकन किया गया है।
आप उपयोग करना उम्मीद कर रहे थे, तो सीमा आधारित छोरों अभिव्यक्ति टेम्पलेट संचालन को लागू करने के लिए, तो आप अपने अभिव्यक्ति टेम्पलेट कक्षाओं में निजी या संरक्षित begin
और end
विधियां उपलब्ध करा सकता। बस सुनिश्चित करें कि प्रत्येक टेम्पलेट वर्ग अन्य टेम्पलेट वर्गों के begin
और end
विधियों तक पहुंच सकता है। इस संदर्भ में यह ठीक होना चाहिए क्योंकि अभिव्यक्ति टेम्पलेट फ़ंक्शन के लिए पैरामीटर है, इसलिए आपको उस फ़ंक्शन के भीतर लूप लिखते समय संदर्भों को लटकने के बारे में चिंता करने की आवश्यकता नहीं होगी।
स्रोत
2012-03-07 07:42:05
'लूप' के लिए श्रेणी-आधारित 'ऑटो' और 'आसानी से पैर में खुद को शूट करने के लिए कुछ हो सकता है - मुझे अभी भी वास्तव में समझ में नहीं आया है कि वास्तव में किस प्रकार के प्रकार प्रभावित होते हैं, और क्यों (lvalue संदर्भ गैर-आधार पर: खतरनाक, गैर-संदर्भ: असंवेदनशील, ???)। – Philipp
@ फिलिप: "रेंज प्रकार" जैसी कोई चीज़ नहीं है। ऐसे कई प्रकार हैं जो "अवधारणा" श्रेणी के अनुरूप हैं। विशेष रूप से, कि 'स्टार्ट/एंड' ओवरराइड की एक जोड़ी है जो इनपुट इटरेटर्स लौटाती है। –
मुझे लगता है कि उत्तर यह सुनिश्चित करना है कि अभिव्यक्ति टेम्पलेट्स "अवधारणा" श्रेणी के अनुरूप नहीं हैं, यानी उनके पास 'प्रारंभ' और 'अंत' नहीं है। – Clinton