2017-04-07 19 views
18

टेम्पलेट क्लास std::iterator को C++ 17 में बहिष्कृत करने के लिए सेट किया गया है। ऐसा क्यों? यह सुनिश्चित करने के लिए एक आसान तरीका रहा है कि std::iterator_traits काम करता है, खासकर यदि आप डिफ़ॉल्ट टेम्पलेट तर्कों का उपयोग कर सकते हैं। क्या सी ++ 17 में ऐसा करने का कोई और तरीका है?std :: iterator क्यों बहिष्कृत है?

+1

हां, सी ++ 17 में एक ही चीज़ करने का एक आसान तरीका है: आप बस वही बात करते हैं _। "बहिष्कृत" का अर्थ है ** केवल ** ** यह ** ** भविष्य में दूर हो सकता है। इसका मतलब यह नहीं है कि आप इसका उपयोग नहीं कर सकते हैं, या यह हमेशा ऐसा नहीं करेगा जो उसने हमेशा किया था। –

+0

@PeteBecker: लेकिन सवाल यह है कि, यदि इसे बहिष्कृत किया गया है, तो प्रोग्रामर इसका उपयोग क्यों करेंगे जब यह * अगले संस्करण में हो सकता है? अगर यह इतना आसान था, तो इसे शुरू करने के लिए क्यों बहिष्कृत किया जाता है? – Nawaz

+0

@ नवाज - जो सवाल पीछे की ओर जाता है। यदि यह मानक में है, तो आप इसका उपयोग क्यों नहीं करेंगे? ** मानक में कुछ भी ** संभावित रूप से भविष्य में दूर जा सकता है। हां, जो कुछ बहिष्कृत है, उसे दूर जाने की संभावना अधिक हो सकती है, या शायद नहीं; सी हेडर पर विचार करें, जिन्हें सी ++ में बहिष्कृत किया गया है, लेकिन एक व्यावहारिक मामले के रूप में, कभी नहीं चलेगा। –

उत्तर

16

the proposal that suggested its deprecation से:

इटरेटर वर्गों लेखन के लिए एक सहायता के रूप में, मूल मानक पुस्तकालय पाँच typedefs iterator_traits द्वारा हर इटरेटर की उम्मीद की घोषणा को स्वचालित करने के इटरेटर वर्ग टेम्पलेट की आपूर्ति की। यह तो std::ostream_iterator के विनिर्देश में, पुस्तकालय अपने आप में इस्तेमाल किया गया था, उदाहरण के लिए:

template <class T, class charT = char, class traits = char_traits<charT> > 
class ostream_iterator: 
    public iterator<output_iterator_tag, void, void, void, void>; 

void तर्कों की लंबी अनुक्रम बस वर्ग परिभाषा ही है, में होने की उम्मीद typedefs उपलब्ध कराने से पाठक के लिए काफी कम स्पष्ट है जो वर्तमान कार्य ड्राफ्ट द्वारा लिया गया दृष्टिकोण, सी ++ 14 में पैटर्न सेट के बाद, जहां हमने unary_function और binary_function से मज़दूरों की लाइब्रेरी में व्युत्पन्न को हटा दिया।

कम स्पष्टता के अलावा, इटेटरेटर टेम्पलेट भी अनचाहे के लिए एक जाल देता है, क्योंकि सामान्य उपयोग में यह एक आश्रित बेस क्लास होगा, जिसका अर्थ है कि यह कक्षा के भीतर से नाम लुकअप के दौरान नहीं देखेगा या इसके सदस्य कार्य।

#include <iterator> 

template <typename T> 
struct MyIterator : std::iterator<std::random_access_iterator_tag, T> { 
    value_type data; // Error: value_type is not found by name lookup 

    // ... implementations details elided ... 
}; 

स्पष्टता के कारण अकेले नहीं रह जनादेश के लिए मानक पुस्तकालय विनिर्देश अद्यतन करने के लिए मानक इटरेटर adapators रूप LWG को मनाने के लिए पर्याप्त था: यह समझने के लिए क्यों निम्नलिखित सरल उपयोग काम नहीं करता है की कोशिश कर हैरान उपयोगकर्ताओं की ओर जाता है std::iterator से प्राप्त, इसलिए मानक के भीतर इस टेम्पलेट का कोई और उपयोग नहीं है। इसलिए, यह बहिष्कार के लिए एक मजबूत उम्मीदवार की तरह दिखता है।

आप LWG 2438 में एसटीएल के तर्क को भी देख सकते हैं। (ज/टी T.C.)


, यह कर वास्तव में नहीं के किसी अन्य तरीके के रूप में। आप मूल रूप से std::iterator (जो बहुत कठिन नहीं है) के अपने संस्करण को लागू कर सकते हैं या मैन्युअल रूप से उन सभी टाइपिफ़ को लिख सकते हैं (जो कि बहुत मुश्किल नहीं है, और मैं वास्तव में इसे स्पष्टता के लिए पसंद करता हूं)।

+2

[एलडब्ल्यूजी 2438] में एसटीएल का तर्क (https://timsong-cpp.github.io/lwg-issues/2438) ध्वनि भी लगता है: नाम उपयोगकर्ताओं को गुमराह कर सकता है (विशेष रूप से * अहम * कुछ अन्य प्रोग्रामिंग भाषाओं से) यह सोचने में कि व्युत्पत्ति अनिवार्य है, या 'std :: iterator' को स्वीकार करने वाले फ़ंक्शन को लिखना अर्थपूर्ण है। –

संबंधित मुद्दे