2012-03-01 9 views
9

में आधारित श्रेणी यह ​​मेरी समझ है कि अभिव्यक्ति टेम्पलेट्स सी ++ 11 के आधार पर विभाजित हो जाएंगे, क्योंकि for (auto x : expr) में auto&& __range = expr अंतर्निहित है, और इसके परिणामस्वरूप संदर्भों को लटकाना होगा।अभिव्यक्ति टेम्पलेट्स और सी ++ 11

क्या अभिव्यक्ति टेम्पलेट कक्षाएं बनाने का कोई तरीका है ताकि वे या तो श्रेणीबद्ध के साथ सही ढंग से व्यवहार कर सकें, या कम से कम एक संकलन त्रुटि फेंक दें?

असल में, मैं संभावना को रोकना चाहता हूं कि अभिव्यक्ति टेम्पलेट सही ढंग से संकलित होंगे लेकिन खतरनाक संदर्भों के कारण रन टाइम में विफल हो जाएंगे। जब तक उपयोगकर्ता अभिव्यक्ति टेम्पलेट्स को लपेटना भूल जाता है, तब तक जब तक कोई मूक रन-टाइम त्रुटियां नहीं होती हैं, तब तक उन्हें किसी भी श्रेणी में उपयोग करने से पहले अभिव्यक्ति टेम्पलेट्स को लपेटने में कोई फर्क नहीं पड़ता।

+1

'लूप' के लिए श्रेणी-आधारित 'ऑटो' और 'आसानी से पैर में खुद को शूट करने के लिए कुछ हो सकता है - मुझे अभी भी वास्तव में समझ में नहीं आया है कि वास्तव में किस प्रकार के प्रकार प्रभावित होते हैं, और क्यों (lvalue संदर्भ गैर-आधार पर: खतरनाक, गैर-संदर्भ: असंवेदनशील, ???)। – Philipp

+1

@ फिलिप: "रेंज प्रकार" जैसी कोई चीज़ नहीं है। ऐसे कई प्रकार हैं जो "अवधारणा" श्रेणी के अनुरूप हैं। विशेष रूप से, कि 'स्टार्ट/एंड' ओवरराइड की एक जोड़ी है जो इनपुट इटरेटर्स लौटाती है। –

+1

मुझे लगता है कि उत्तर यह सुनिश्चित करना है कि अभिव्यक्ति टेम्पलेट्स "अवधारणा" श्रेणी के अनुरूप नहीं हैं, यानी उनके पास 'प्रारंभ' और 'अंत' नहीं है। – Clinton

उत्तर

2

कुछ विकल्प हैं जिनके बारे में मैं सोच सकता हूं, प्रत्येक अपनी खुद की कुरूपता के साथ।

एक स्पष्ट विकल्प संदर्भों के बजाय पॉइंटर्स (शायद unique_ptr) का उपयोग करना है। बेशक, इस काम के लिए, इसे या तो ढेर, या कस्टम आवंटकों से आवंटन की आवश्यकता होती है। मुझे लगता है कि एक अच्छा आवंटक के साथ, इस दृष्टिकोण में कुछ योग्यताएं हैं। फिर फिर, ऑपरेटर ओवरलोडिंग सिर्फ बुरा हो जाएगा।

एक अन्य दृष्टिकोण उप-अभिव्यक्तियों को कॉन्स संदर्भ के बजाय मूल्य द्वारा संग्रहीत करना है। इस दृष्टिकोण की दक्षता बहुत संकलक-निर्भर है, लेकिन चूंकि आप मूल रूप से अस्थायी समूह के साथ काम कर रहे हैं, इसलिए मैं कल्पना करूंगा कि आधुनिक कंपाइलर प्रतियां (या कम से कम, बहुत सारी प्रतियां) को अनुकूलित कर सकते हैं।

अंतिम दृष्टिकोण आपको एक ही संरचना को आपके कोड में रखने की अनुमति देता है, लेकिन उपयोगकर्ता को अभिव्यक्ति का मूल्यांकन करने के लिए मजबूर करता है। यह आवश्यक है कि आपके पास केवल एक ही प्रकार का प्रकार हो, जो अभिव्यक्ति का अंतर्निहित प्रकार है (कहें, std::vector<int>)। अभिव्यक्ति वर्गों में से कोई भी begin और end उनके लिए परिभाषित विधियों या कार्यों के साथ होना चाहिए, लेकिन केवल अंतर्निहित प्रकार में परिवर्तनीय होना चाहिए। इस तरह, for(auto x : expr) जैसे कोड संकलन-समय पर असफल हो जाएंगे (क्योंकि expr पुनरावर्तनीय नहीं है), लेकिन for(auto x : static_cast<vector<int>>(expr)) लिखना काम करता है क्योंकि अभिव्यक्ति का पहले ही मूल्यांकन किया गया है।

आप उपयोग करना उम्मीद कर रहे थे, तो सीमा आधारित छोरों अभिव्यक्ति टेम्पलेट संचालन को लागू करने के लिए, तो आप अपने अभिव्यक्ति टेम्पलेट कक्षाओं में निजी या संरक्षित begin और end विधियां उपलब्ध करा सकता। बस सुनिश्चित करें कि प्रत्येक टेम्पलेट वर्ग अन्य टेम्पलेट वर्गों के begin और end विधियों तक पहुंच सकता है। इस संदर्भ में यह ठीक होना चाहिए क्योंकि अभिव्यक्ति टेम्पलेट फ़ंक्शन के लिए पैरामीटर है, इसलिए आपको उस फ़ंक्शन के भीतर लूप लिखते समय संदर्भों को लटकने के बारे में चिंता करने की आवश्यकता नहीं होगी।

6

आमतौर पर आप इसके बारे में कुछ भी नहीं कर सकते हैं। यदि आप श्रेणी के रूप में अभिव्यक्ति देते हैं, तो उसे for कथन के प्रारंभ होने के बाद मान्य होना चाहिए। और संकलन समय पर पता लगाने का कोई तरीका नहीं है कि किसी भी विशेष प्रकार को auto द्वारा घटाया गया था।

आपकी अभिव्यक्ति प्रणाली को अधिक गति-आधारित बनाना बेहतर होगा, ताकि संदर्भों को धारण न किया जाए। इससे संभावित रूप से मृत चीजों के संदर्भों को संग्रहीत करने की कोशिश करने से auto के साथ अधिक सुरक्षित परिणाम मिलेंगे। यदि गैर-चलने योग्य प्रकारों की प्रतिलिपि आपको परेशान करती है, तो बस इसके साथ रहें।

+2

यह समस्या का समाधान नहीं करता है। लूप के लिए आपकी श्रेणी-आधारित में एक अंतर्निहित 'ऑटो और& __ रेंज = listOfInt; 'है, जो' listOfInt' वास्तव में कुछ अभिव्यक्ति टेम्पलेट वर्ग का मान था, तो समस्याएं पैदा कर सकती हैं। –

+0

@ रिचर्डस्मिथ: यह सच है, मुझे लगता है कि उस मामले में एकमात्र चीज एक स्पष्ट कलाकार या एक नया स्वचालित चर प्रस्तुत कर रही है। – Philipp