मेरे पास एक ऐसा फ़ंक्शन है जिसे कई बार एक इटरेटर की गणना करने की आवश्यकता होती है, लेकिन according to MSDN, "एक बार जब आप इनपुट इटरेटर की किसी भी प्रतिलिपि को बढ़ाते हैं, तो दूसरी प्रतियों की सुरक्षित रूप से तुलना नहीं की जा सकती है, इसके बाद संदर्भित किया जा सकता है या उसके बाद वृद्धि नहीं की जा सकती है।"एक पुनरावर्तक को अग्रेषित करने के लिए एक पुनरावर्तक को कैसे प्रतिबंधित करें?
इसलिए गैर-फ़ॉरवर्ड-इटरेटर्स के लिए एक अलग कार्यान्वयन बनाने के बजाय चीजों को आसान बनाने के लिए, प्रतिलिपि बनाने के लिए, प्रतिलिपि बनाने के लिए, मैं अपनी विधि को केवल अग्रेषित करने वालों को आगे बढ़ाने के लिए प्रतिबंधित करना चाहता हूं, और इनपुट इटरेटर्स को स्थिर रूप से अस्वीकार करना चाहता हूं ।
अभी मैं कुछ इस तरह है:
template<typename It, typename TCallback /*signature: bool(value_type)*/>
bool EnumerateTwice(const It &begin, const It &end, TCallback callback)
{
for (It it = begin; it != end; ++it)
if (!callback(*it))
return false;
for (It it = begin; it != end; ++it)
if (!callback(*it))
return false;
return true;
}
लेकिन कुछ भी एक आगे इटरेटर होने के It
प्रतिबंधित करता है।
मैं टेम्पलेट फ़ंक्शन पर उस प्रतिबंध को कैसे रखूं? (सी ++ 03)
+1 Oooooo नहीं जानता था कि इटरेटर टैग किए गए हैं! यह बहुत आसान है। आपका बहुत बहुत धन्यवाद! :) – Mehrdad
यह बिडरेक्शनल और यादृच्छिक-पहुंच इटरेटर्स को अस्वीकार कर देगा। उचित अर्थशास्त्र के लिए 'is_same' के बजाय' is_base_of' का उपयोग करें। – ildjarn
@ildjarn: ओह हाँ, अच्छा बिंदु; धन्यवाद! – Mehrdad